晴天i1 发表于 2021-11-29 08:02

工控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:}

wu0o0pj 发表于 2021-12-11 09:03

么么 发表于 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 09:57

本帖最后由 晴天i1 于 2022-7-29 10:01 编辑

iokou 发表于 2022-7-29 09:16
485通讯,1主多从的情况下,个人喜好还是用ModBus协议,现成的标准,稳定……
是的那! 遗憾的是这款不支持Modbus RTU   而且回复也有说,有标准协议的尽量用标准协议    这个玩有点麻烦,不过也是解决不标准协议的一种办法而已

d199212 发表于 2021-11-29 08:06

感谢楼主分享

yyb414 发表于 2021-11-29 08:31

非常感谢

cao10085 发表于 2021-11-29 08:42

论坛工控第一人,还有法宝吗

yaphoo 发表于 2021-11-29 08:49

思路清晰,实用性强,感谢分享!

slbcmgn 发表于 2021-11-29 09:00

感谢感谢楼主

晴天i1 发表于 2021-11-29 09:02

cao10085 发表于 2021-11-29 08:42
论坛工控第一人,还有法宝吗

工控倒数第一人{:1_907:}

yixin0 发表于 2021-11-29 09:13

这个玩法,有点内容蛤

晴天i1 发表于 2021-11-29 09:15

yixin0 发表于 2021-11-29 09:13
这个玩法,有点内容蛤

这个方法会了,一般的通讯差不多都可以解决了吧!!不过有标准协议的最好还是用标准协议,这个有点麻烦!!!

none。 发表于 2021-11-29 09:16


感谢楼主分享
页: [1] 2 3
查看完整版本: 工控PLC做自由协议轮询读取多个设备数据