工控PLC做自由协议轮询读取多个设备数据
采用信捷PLCXD5E 做自由协议轮询设备为RKC温控表,使用串口助手调试发送16进制数据至RKC温控表,其他设备大同小异发送:04 30 31 4D 31 05
接收:77 6E 30 30 30 31 30 2E 37 32 6B 67 0D 0A
数据 结束符
设备可以成功返回数据说明设备通讯OK,而且拿到了正确的报文。
然后就是PLC的编程,
先做一个定时器,在做一个计数器,定时器时间按照轮询时间,
把发送的报文传送至相邻的寄存器里,
使用SEND指令发送报文(转送到寄存器里的数据),
RCV指令接收数据,用计数器来确定是否接收,接收的是哪台设备,例如; 计数器=1时,接收数据存放到D300,计数器=2时存放D400
接收的数据都是报文形式的,然后再做计算就ok。
附件贴几张PLC程序图。
注:经验分享,有违规或有异常,麻烦管理员及时删帖,谢谢{:1_893:} 么么 发表于 2021-12-10 23:54
时钟可以的在plc把时钟勾上 比如0 第一个用m0.7 第二用取反的0.7
这说的是西门子吧,印象中三菱FX、Q之类的没有这样用 M 的哟。。。
既然是轮询,那说明是走的是485总线之类的通信,有多个报文需要收发(不论是单台仪器的多个报文,还是多台仪器的单个报文,还是多仪器多报文);
假设有10条报文需要收发;
LZ说的计数器,应该是 index,指向当前收发的是这10条中的某一条;
而每条报文的收发是需要时间的,这要看串口波特率,通讯线状况,报文长度、设备反应速度、协议要求等等;
另外,类似标准的ModbusRTU协议,还定义了两个报文间最少的时间间隔;
那定时器主要就是定义每个报文的操作时间,时间到了,就轮到下条报文的发送和接收;
当然,如果是像三菱,通信时可以定义串口本身的超时时间,但这个是收到第一个字符开始计时,如果另一端一直没有返回报文,那还是要用这个定时器计时,确认通信超时,并切换到下一条报文;
虽然有些麻烦,但这样可以节省收发时间;
比如正常通信发送20ms,接收100ms,那加上 delay 30ms,一个报文需要150ms,就可以切换到下一条报文了;
假设定时器设置的是1000ms,那一条就是 1020ms 了;
当然如果一直没返回,那两种其实都一样;
像某条报文超时多次,还可以减少它的执行次数,可以从每次轮询都收发 变成 每3次轮询才收发一次,从而减少其他报文受这条的影响;
很多的组态都有这种轮询机制;
本帖最后由 晴天i1 于 2022-7-29 10:01 编辑
iokou 发表于 2022-7-29 09:16
485通讯,1主多从的情况下,个人喜好还是用ModBus协议,现成的标准,稳定……
是的那! 遗憾的是这款不支持Modbus RTU 而且回复也有说,有标准协议的尽量用标准协议 这个玩有点麻烦,不过也是解决不标准协议的一种办法而已 感谢楼主分享 非常感谢 论坛工控第一人,还有法宝吗 思路清晰,实用性强,感谢分享! 感谢感谢楼主 cao10085 发表于 2021-11-29 08:42
论坛工控第一人,还有法宝吗
工控倒数第一人{:1_907:} 这个玩法,有点内容蛤 yixin0 发表于 2021-11-29 09:13
这个玩法,有点内容蛤
这个方法会了,一般的通讯差不多都可以解决了吧!!不过有标准协议的最好还是用标准协议,这个有点麻烦!!!
感谢楼主分享