手头有威伦51ip的屏幕,打算吃30kpa量程的风压变送器。风压变送器用rs485通信;已经事先在电脑上sscom测试使用没有问题,如下图
必须先发风压变送器的指令,它才会返回数据。
发数据解释:01h 代表从机地址,现在是1,03h功能码,00 04h2位u16代表读取压强,00 01h2位u16代表传输压强的数据位数。后面c5 cb是crc校验
收数据解释:前2个u16与发数据一样(如果接收了的话),02h代表数据位数是2位,00 00h压差为00.00kpa。b8 44也是crc校验
好,硬件都没有问题,如何让屏幕自己发收数据呢?
我自己给屏的宏指令是
short data[6] = {0x00,0x04,0x00,0x01,0xc5,0xcb}
GetDataEx(data[0],"MODBUS RTU",4x,1,6)
SetDataEx(data[0],"Local HMI",RW,80,6)
考虑到威伦官方给的手册会把从机地址,从机功能码自己加上,所以我写了如上的代码。然而没有反应。下面给出手册截图
也就是说用4x的地址,屏幕应当是自己先给了01h 03h这样的开头,然后再附带data数组的六个数据组成01 03 00 04 00 01 c5 cb发出去给风压变送器,然后自己接收一串数据,存到data里,再写到RW区。
以上想法也许是错的,所以接着试验:如果威伦自己不带01 03开头如何?
short data1[8] = {0x01,0x03,0x00,0x04,0x00,0x01,0xc5,0xcb}
SetDataEx(data1[0],"MODBUS RTU",4x,1,8)
DELAY(1)
GetDataEx(data1[0],"MODBUS RTU",4x,1,8)
SetDataEx(data1[0],"Local HMI",RW,80,8)
失败了,我还试验了种种setdata和getdata,以及data数据内容的排列组合,我现在已经疯了。
现在目的就是这个屏幕到底怎么输出到modbus rtu去的,到底输出了什么导致没有反应?
我的导师说可以读,我不太确认,他也在忙别的事情,我不好打扰
最后附上系统参数设置
我还怀疑是设备类型的问题,应当用哪一个modbus呢?
楼主最近还看过
好的,谢谢,发的问题我也解决了,问题不在发这边。我把威伦屏转usb连在电脑上,用sscom验证了,这个屏发东西没有问题。
这是我的宏指令
macro_command main()
unsigned char data[8] = {0x01,0x03,0x00,0x04,0x00,0x01,0xc5,0xcb}//必须用unsigned char而不是short
unsigned char result[8] = {0}
unsigned short res[8] = {0}
unsigned short flag = 0xff
OUTPORT(data[0],"RTU",8)//从串口发data
INPORT(result[0],"RTU",8,flag)//从串口收sscom串口数据
DELAY(10)
OUTPORT(result[0],"RTU",8)//返回给sscom
res[0] = 0 | result[1]
res[1] = 0 | result[0]
res[2] = 0 | result[3]
res[3] = 0 | result[2]
res[4] = 0 | result[4]
res[5] = 0 | result[5]
res[6] = 0 | result[6]
res[7] = 0 | result[7]
SetData(res[0],"Local HMI",RW,80,8)//显示内容
SetData(flag,"Local HMI",RW,90,1)
end macro_command
之前写的代码用的short是不对的,我的问题;然后手册给了一个收发串口的函数我也没有注意。
然后代码没有问题,但是验证的时候出问题了:
我先按下开关进行一次宏指令,串口先发出01 03 00 04 00 01 c5 cb,然后sscom点击发送随便一串数据,然后屏幕原原本本返回接收到的信息,如图:
经过多次实验,我发现第一个数据永远是对的,然后总会被吞一些数据;确实最可能是波特率有问题,但是:
不就是9600吗,我真的......
收数据还是有问题,请大佬指点。