使用的PLC型号为CP1H-40DT-D,使用的串口是串口2,接口是RS485。
测试程序如图1所示。
图1
测试方法:
在串口调试助手按16进制发送,每次发送3个字节,如 0x32 0x33 0x36
第一次发送这3个字节到串口2,D1000寄存器上显示的数值为0x3233
第二次发送这3个字节到串口2,D1000寄存器上显示的数值为0x3336
第三次和第一次同样效果,第四次和第二次同样效果。
我比较困惑数据为什么会是这样,再加上文档的这句话,如图2所示。以为数据出错。
图2
以下是我的一些个人理解,有错的话欢迎指正。
图2所讲的含义应该是不清除D1000里面的数据,我之前误解为读出数据后,串口2接收缓冲区数据不清空。
整个程序的执行流程应该是当串口调试助手第一次发送0x32 0x33 0x36到PLC,PLC接收到3个字节,缓冲区里面的字节数大于设定的2(即图1的&2),则A392.06置ON,此时PLC从缓冲区中读取出前面的两个字节到D1000,即D1000的数据为0x3233;
当串口调试助手第二次发送0x32 0x33 0x36到PLC,PLC又接收到3个字节,再加上上次没读取出来的0x36,所以此时缓冲区里面的数据应该是0x36 0x32 0x33 0x36,即4个字节。此时注意RXD指令,每当缓冲区里面的字节数达到2时,A392.06置ON,PLC就会将这两个字节读取出来,所以缓冲区里面的4个字节是分两次读取,第一次读取0x36 0x32,所以D1000数据为0x3632,但是此时串口缓冲区剩余的字节数又刚好是2,所以将0x33 0x36读取出来,存储到D1000,0x3336将上次的0x3632覆盖掉。所以出现了0x3233、0x3336交替出现的情况。
为了验证猜想是否准确,第一次发送0x32 0x33 0x36,第二次只发送一个0x35,出现的情况如下:
第一次D1000的值为0x3233;
第二次D1000的值为0x3635;
验证了之前的猜想是正确的。
RXD指令的特点是只有当串口接收缓冲区的数据字节数等于设定值才会将数据读取出来保存到设置的寄存器中,超过的字节数且不是设定值的整数倍,不读取。
当发送的字节数不确定的时候,建议使用数据帧的格式接收,然后将接收的字节数设定大一点,这样就会按照一帧一帧的格式接收数据。