回 帖 发 新 帖 刷新版面

主题:求救!关于RS485在QB下的通讯问题

用仪表生产厂家提供的测试通讯程序能读出仪表的PV值,但生产厂家未能提供QB下的测试程序,通讯协议如下
1.        RS485通讯协议
1.1.        主从式半双工通讯,主机呼叫从机地址,从机应答方式通讯。串行通讯,数据帧11位,1个起始,8个数据位,2个停止位

1.2.         数据传输格式采用标准ASCⅡ码
1.2.1.    通讯数据字符集
0(30H)    1(31H)    2(32H)     3(33H)    4(34H)5(35H)     6(36H)    7(37H)
    8(38H)    9(39H) A(41H)    B(42H)C(43H)    D(44H)    E(45H)
F(46H)     .(2EH)     -(2DH)    +(2BH)

1.2.2.    通讯控制字符集
DC1(11H):读瞬时值            DC2(12H):读参数
DC3(13H):写参数                    DC4(14H):读写FCC5000
STX(02H):从机起始符            ETX(03H):主机结束符
ETB(17H):从机结束符                RS (1EH):数据间隔符
uS (1FH):参数间隔符                ACK(06H):接收正确
NAK(15H):接收错误                CAN(18H):通讯复位
SP (20H):空白符

1.3.        通讯协议
1.3.1.    读瞬时值
1.3.1.1.  读单通道瞬时值
            主机发送:    DC1 AAA CC ETX
                        DC1(11H)    :    读瞬时值
                        AAA           :    从机地址码(=001~254)
                        CC               :    通道号(=01-99)
                        ETX(03H)    :    主机结束符
        从机回送:    STX AAA CC US MM US DDDDDDD US EEEE US SSSSS ETB
                        STX(02H)    :     从机起始符
                        AAA           :      从机地址码(=001~254)
                        CC            :      通道号(=01-99)
                        US(1FH)     :      参数间隔符
                        MM               :      表型字(=00~99)
DDDDDDD        :    瞬时值(-32167~32767,32767=brok,16000=H.oFL,-2000=L.oFL,
小数点在实际位置)
                        EEEE          :     报警1~4报警状态(E=0:OFF  E=1:ON)
                        SSSSS         :      校验和5位十进制=00000~65535,从STX到最后一个US间每个
字符ASC值的和,再除以65536的余数)
                        ETB(17H)    :      从机结束符
        例子:
        主机发送    :    11H 30H 30H 31H 30H 31H 03H(读001号表01通道瞬时值)
        从机回送    :      02H 30H 30H 31H 30H 31H 1FH 30H 36H 1FH 2DH 30H 31H 32H 33H 2EH 34H 1FH 31H 30H 30H 30H 1FH 30H 31H 30H 30H 34H
17H(001号表为XMA5000系列,01号通道瞬时值=-0123.4,报警1
动作,报警2不动作,校验和=1004)


我写的测试程序无法运行,提示 I/O 设备错误,请大家帮我看看,有什么问题?
OPEN “COM2:9600,N,8,2” FOR RANMDOM AS#1
PRINT #1,CHR$(17)+CHR$(48)+CHR$(48)+CHR$(49)+CHR$(48)+CHR$(49)+CHR$(3)
FOR I= 1 TO 10000:I=I+1:NEXT (延时)
LINE [color=FF0000]input[/color] #1,A$
PRINT A$
CLOSE #1
END

回复列表 (共16个回复)

11 楼

谢谢MOZ!
参照你的程序上去试了一下,
终于能读出了字符,可惜不是仪表的PV值,但已经看见希望了,
这个循环我不懂,能解释一下吗,谢了
do while loc(1)
  if loc(1)>128 then
    print #1,chr$(19);
    a$=input$(loc(1),#1)
    print len(a$);a$
  else
    print #1,chr$(17);
  end if
loop

12 楼

谢谢MOZ!
参照你的程序上去试了一下,
终于能读出了字符,可惜不是仪表的PV值,但已经看见希望了,
这个循环我不懂,能解释一下吗,谢了
do while loc(1)
  if loc(1)>128 then
    print #1,chr$(19);
    a$=input$(loc(1),#1)
    print len(a$);a$
  else
    print #1,chr$(17);
  end if
loop

13 楼

呵呵,那就行了,要再读数据是不是得再往机器发送数据?

do while loc(1)
是把设备当文件使用,
当有数据返回的时候,就相当于这个文件有了长度,(非空)
loc(1)就是这个文件的长度
照这个长度把数据读进来就对了.

至于控制字符chr$(19),chr$(17)的作用我是不太清楚,
估计不同的设备这些 暂停/继续 的控制符会有不同吧,
你试试改一改看看.

14 楼

对了,还有一个比较难掌握但听说很好用的一个方法:

1. 找到端口地址
2.  i%=inp(端口)  可以读入一个字节
3.  out 端口,o%     可以写入一个字节

我没有实践的基础
搞坏了别要找我索赔喔.

15 楼

老兄,问题解决了么?

16 楼

出差几天,回来试了一下,还是不行!郁闷!!!!!!!!!!!!!![em10][em10][em10]

我来回复

您尚未登录,请登录后再回复。点此登录或注册