【松下PLC.通信】——威卡力传感器如何和松下PLC进行Free协议的通讯
如果现在有这样一个需求,你接手了一个活,摆在你面前的是一个松下FP0H,还有一台威卡B6542传感器(只支持485或者232通讯),需求就是要你做一个称重仪器,你该怎么做。
首先在成本考虑且没有要求传输速度等的情况下,应用的情况是单对单,那就选择232串口通讯。
具体的威卡传感器的232接线图和传感器和放大器的接线图可以参考官网,或者公众号发送B6542领取,这里不再赘述。
放大器的配置
这里截取一下威卡传感器的Free协议,使用这个协议的目的,就是想要做一个无协议通信,这样就不必关注Modbus或者其他协议对应的地址的内容了,只需要考虑报文发送过来的有效数值在数字哪一个位置即可。
从上图可知厂家定义的协议内容,使用free协议可以直接在PLC中进行收发报文,对于初学者来说,不懂modbus的情况下,首选这种方式。可以在懂得了modbus协议内容的情况下,再去选择使用它。
那么如果要进行数值的读取,配好的报文就是
'FE 01 50 CF FC CC FF'
当然选择free协议的一个弊端就是,需要在使用此协议时,若发现通信内容不对或者通讯上了但就是收到的内容不对,这个时候就应该去考虑,是不是厂家把协议内容换掉了。
那我们默认选择了free协议,同时232通讯,这个时候就可以去参考说明书把放大器的选项配置一遍,这里截取部分为
更详细的请看说明书。配置好它之后,我们就可以去松下Pro7中去配置FP0H的通信参数。
松下PLC的配置
通信配置:配置115200的目的是为了响应和传输尽可能及时。
这里再解释一下大小端,如果按照松下FP0HPLC来说,它的系统的网络字节序默认小端。也就是从左到右数,第一个字节是低8位,第二个字节是高8位,也就是如果是AB(我们这么读),那么把这个AB输入给PLC时,他先读到的是A低8位,然后再是B高8位,但PLC中展现的就是BA(PLC的意识中),发送时先发送A再发送B。大端的话,从左到右,第一个字节是高8位,第二个字节是低8位。也就是我们的意识是AB,plc的那边,也是AB。
又因为我们松下PLC是要发送给B6542的,他的脑子里,他只认识FE 01 ......这种顺序。
根据B6542的说明书给的内容进行报文配置,直接在程序中写出:
说明:底层通讯传输就是以字节数组进行传输的,这里以字为一个单位的话,就是有16位,即2个字节,松下plc中每个word存在高低字节转换,如果是以16进制存储的话,就可以存储下FE01。所以报文内容是反着,FE01反过来就是01FE。因为采用的是小端,存储时是01FE,发送出去的报文就是FE01,到传感器端就是先存储而传感器只认识FE01。
那么通信的代码就是:
这里代码说明:port表示的是我们的配置的端口,这里使用的是Com0口。SendData,Start表示的是发送的首地址,numberOfBytes是发少个字节过去,我们这里可以知道,整个报文过去是7个字节。
那么接收就是,配置的时候,我们选择一个地址去接收整个内容
这里还是以word类型的数组去接收整个内容。
按照说明书的应答模式,我们知道接收到的报文大致内容为"00 06 FE 01 00 00 50 xx XX CF FC CC FF 00",这里接收的字符数组,会在开头表示数组长度。
那么接下来的难点,就是对整个报文进行解析,我们可以知道,到时候回传回来的内容,16#01FE 16#xx50 16#CFXX等,是4个为一组在一个word里面,我们是以word数组去接收的,那么解析的时候,要取到整个值,xxXX(这个是传感器那边的报文值),但是现在有个问题,他们在数组不同的位置,一个在3一个在4,如果要拼接这两个,就需要使用到字符串,所以我想的方法是先把word转换为字符串,再用字符串进行拼接,最后再转成word。那么此时我们转完字符串之后,我们会发现,前面多了16#,这个时候就可以使用字符串移位去找到所需要的内容xx50和CFXX,之后得到xx50和CFXX之后,我们再继续使用Right移位(CFXX)和Left移位(xx50),得到xx和XX,这个时候再去拼接成xxXX。这里的这个xxXX就是我们正常的数据的形式,字符串就是是什么顺序就是什么样的顺序。
拼接后得到xxXX,然后再使用string_To_Word去获得整个字,再通过这个字去转Real类型就可以得到我们想要的值了。
部分代码如下:
这里的高位和低位,我们又是从大端角度来考虑的(人怎么读,左高右低),得到的这个实时数据1,可以根据需要去进行word转其他类型。
欢迎关注gzh,一起研究学习,不足之处请指正。