这篇主要是关于S7接收或者发送二维码的字符串或者其他类型的字符串;内容中的上升沿触发(接收事件)和心跳(心跳管理)可忽略,权当拓展
先将简易的环境搭建好
I. 搭建西门子PLC 的环境 (如果没有直接跳过,既然会看到这篇文章,那这个S7的环境应该是存在的,或者直接问电气工程师,简单给你搭一个string类型的变量的DB块地址)
II. VM连接上西门子PLC
设置好“接收事件”,为了接收到上升沿信号(寄存器地址Start必须开启轮询读取才可正常进行上升沿的触发)
设置好“心跳管理”,为了发送心跳信号给PLC
设置好“全局触发”,为了上升沿信号能进行触发流程
“设备管理”中将需要读取或写入的寄存器地址设置好(Heart字节长度为1因为是bool类型;Start不能设置为bool类型,因为目前VM好像不支持,只能设置为int类型进行上升沿触发,并且需要开启轮询读取,上述也说到了;QR Code 字节长度设置为33,因为我后续加载的图片,识别到的字符信息为31位的:E3001629ACV37377002001GY2600035,为什么要设置为33位,往后看就明白了)
并新建好“S7”的VM流程(此处简易搭了一下)
至此,简易的环境已搭好,VM可正常连接PLC,并可以读取或写入变量至PLC的DB块的地址中III. 进入主题,该对二维码的字符串进行操作了
1. 先尝试直接运行流程,“接收QR”模块中的模块结果:QR Code目前也是空的 (这不是废话!!!并不完全是空的,而是看不到,显示不出来)
2. 我们手动在PLC的偏移量4.0中,将值修改一下,修改成A1B2C3(随便什么字符都行),再运行读取,此时将原图命名直接绑定为接收到的字符信息“接收QR”,那输出图像模块会抛出异常,显示保存文件数据失败
此处是因为,接收到的字符,并不只有A1B2C3,如下:
在A1B2C3之前,会存在两个特殊字符([1F][06],或者其他的字符,在VM的模块中接收时并不会显示出来)占用导致无法直接使用接收到的字符进行命名并存图,当使用脚本模块“去除特殊字符”时,使用正则表达式进行筛选,并输出不带特殊字符的字符串“QROutput”,再使用输出图像模块的原图命名绑定脚本的“QROutput”,这样就可以将处理过后的无特殊字符的二维码信息进行图片命名
!!!这也就是之前字节长度需要多设置两位的原因,因为不多设置两位为33,正常31位的二维码信息,由于前面两个特殊字符的原因,最后两位在VM中就读取不到了
IV. 拓展一下发现的其他问题
前面的是接收PLC发送过来的字符,现在需要将识别的字符发送给PLC
1. 当图像中本来就有二维码的信息,通过“二维码识别”出来的字符,直接绑定到“输出图像”当然也可以直接保存图片
2. 现在尝试将识别到的字符发送给PLC
字符串可以直接发送给PLC,但是在PLC的DB块中显示会不显示前两位的字符信息
但是我们重新读取PLC此DB块中的内容,就没有特殊字符在前面了,但是最后会多出两个字节
(这就是前面为什么将字节长度设置为33的原因,因为要测试发送二维码信息给PLC,此处的二维码信息为31位)
再来看一个问题:我们将发送给PLC的地址,手动再修改为短一点的字符,修改为A1B2C3,然后使用VM的“接收QR”再进行读取DB块的字符信息,会发现此时明明DB块内只有A1B2C3,但是接收到的确是修改后的字符加上之前的一堆的二维码的字符,之前的字符并没有被清空,所以在正常情况下,如果我们发送过二维码的信息,然后PLC又重新发送给我们新的字符信息,需要PLC在他们那边进行完全清空或其他处理,视觉方面才能再次读取,否则会出现其他之前未被清除的字符
总结:① Plc给我们发送字符,如果PLC不经过处理,VM接收到的是存在特殊字符的,需要多增加两个字节长度,并通过脚本进行处理特殊字符;
② 我们给PLC发送字符,是不存在特殊字符的,但是在PLC的DB块显示方面会有点异常,但是我们重新接收,也是不存在特殊字符的
③ 当视觉方面给plc发送过字符,PLC再重新给我们发送字符,PLC需要将原来的数据完全清空(或者发送同样长度的字节信息进行覆盖原字符信息),我们才能再此接收(当然目前只是举例,得看实际应用场景)