一、写法
写命令立即读出
写命令后立即读出,在同一时间不能有多个地方写入,因此需要在整个写入后读出过程加锁
项目中会存在多个循环并行执行该VI,轮询PLC指令
在锁内耗时,就是TCP读写的实际耗时为5-8ms,在主VI六个循环里统计的耗时是读取PLC寄存器的整个耗时为10-40ms:
因此可以得出结论,由于锁会让TCP读写的代码块变为同步,因此如果越多地方在同一时操作PLC寄存器,会增加整体耗时。
在项目中轮询信号应该只在一个地方批量把寄存器里的值读取出来。
写法1:以"写命令立即读出"用一个地方批量读取,其他地方间隔写入
下面用fins udp进行测试:
- 读取是可重入
- 写入是不可重入
- 在操作tcp时加锁
工况1
- 一个循环批量轮询PLC信号,间隔1ms
- 一个循环读取字符串(INT数组),间隔2000ms
- 32个循环4s内随机间隔写入一个寄存器
轮询的耗时大概为20-30ms,写入的时间也大概为20-30ms,对应
工况2
- 一个循环批量轮询PLC信号,间隔1ms
- 一个循环读取字符串(INT数组),间隔1ms
- 32个循环4s内随机间隔写入一个寄存器
轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长
增加一个读取条码的循环后,耗时增加
工况3
- 一个循环批量轮询PLC信号,间隔1ms
- 一个循环读取字符串(INT数组),间隔1ms
- 32个循环写入一个寄存器,间隔1ms
轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长,相对第二种无变化
结合工况2,可以得出write.vi的间隔减少,不影响read.vi的耗时,因此轮询的地方越少越好
工况4
- 一个循环批量轮询PLC信号,间隔1ms
- 一个循环读取字符串(INT数组),间隔1ms
- 32个循环写入一个寄存器,间隔1ms
- 增加8个循环轮询一个寄存器,间隔1ms
轮询的耗时大概为150-200ms,写入的时间也大概为150-200ms,耗时大大加长
结合工况2和工况3,可以得出read.vi的间隔减少,会影响read.vi的耗时,因此轮询的地方越少越好
工况5
- 一个循环批量轮询PLC信号,间隔1ms
- 一个循环读取字符串(INT数组),间隔1ms
- 32个循环写入一个寄存器,间隔1ms
- 增加8个循环轮询一个寄存器,间隔2000ms
轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长,和第二种相当
结合工况3和工况4,可以得出read.vi的间隔减少,会影响read.vi的耗时,但是间隔较长的话,影响会比较小,因此轮询的地方越少越好
工况5
- 一个循环批量轮询PLC信号,间隔1ms
- 一个循环读取字符串(INT数组),间隔2000ms
- 32个循环写入一个寄存器,间隔1ms
- 增加8个循环轮询一个寄存器,间隔2000ms
轮询的耗时大概为20-50ms,写入的时间也大概为20-50ms,耗时相对第一种加长,和第二种相当
但是读取条码的耗时会加长,30-158ms
结合工况5,可以得出read.vi的耗时需要看同一时间有多少在执行,由于锁,耗时会浮动较大
二、测试
-
PC和PLC交互的耗时在于:①交互的时间,多个PC操作一个PLC的时候,可能会减慢,②同一个程序,多个地方读写,锁的耗时
-
PC执行一条读/写指令的耗时是相同的,批量读1000个地址和读1个地址的耗时是一样的
-
多个地方在同时读写,会因为锁的原因,实际执行是按顺序执行的,也就是说,同一时间,很多地方在读/写的话,会存在先后执行关系
以下日志实际是6个同时写入,<注液孔定位1X_PC>先写完,<注液孔定位2Data_PC>最后写完,总耗时是411
-
以50ms轮训,PLC拿到复位信号,大概在30ms以内,说明PC和PLC彼此响应的时间都比较快
三、交互原则
1、所有地址规划在一个较小的范围内,以免返回字节过多,测试1000个一次读取和一次
2、尽量减少轮询的地方,最好只有一个循环在轮询,通过队列来触发流程
3、最简交互:
- 握手交互
①PLC→PC:将结论置0,将握手赋值非0,具体值可以再规划,例如可以按照工位,触发工位1,就将握手赋值1等等
②PC→PLC:轮询握手,不为0时,把值缓存下来,并将握手赋值为0 - 数据交互
③PC→PLC:执行正常流程,把所有该发送的数据尽量调整至一条指令发送,由于大部分PLC不支持随机写,所以要求数据尽量连续