前段时间因为客户需求 让我调试一个霍尼韦尔扫码枪 要走以太网通信
之前调的扫码枪基本都是走串口 在网上没查到什么资料 虽然有些小问题 但是最后也算调出来了
后来又遇到一些同行询问扫码枪走以太网的方式 索性就写一篇小教程吧
知识有限 难免出错 欢迎指出
1200走以太网通信一般就是TCP/IP 可能有的会用到UDP
简单来说 TCP通信就是三步 1.建立连接 2.发送/接收数据 3.断开连接 博图对这三个步骤都做了封装 我们只需要填出入库参数即可
博图中有两种TCP通信函数 一种是将3步整合在一起 一种是三步分开调用的函数 如下图
为了更清楚的理解TCP的三个步骤 先讲讲第二种
(1)TCON
TCON就是三步中用来建立连接的函数 调用TCON函数 点击右上角组态
在下方的属性页面出现如下图界面 在伙伴栏选择未指定 然后在连接数据中选择新建
填写伙伴方IP地址 以及伙伴端口号 若扫码枪采用以太网通信 都需要提前配置好IP地址和端口号 端口号要从2000开始
配置好后TCON需要一个使能信号
这里解释一下ID的含义 当客户需要多台设备(不仅仅是扫码枪)都使用同一个IP地址时,就需要通过ID号来区分不同的设备 但是一般情况下IP地址是绝对够用的 所以就为每一个设备分配了单独的地址 因此ID号保持缺省状态就行
(2)TRCV_DB
数据接收函数 需要接入一个使能信号 这里建议使用1s的时钟来进行1s接收一次数据 ID号要与前面建立连接的ID一致
关键点是这个DATA参数 我第一次建立的是200长度的Array of Word类型数据 但是接收到的数据怎么都不对
后来我直接把扫描枪和笔记本用网线连起来 通过网络调试助手直接在电脑上显示扫到的数据 以16进制显示的情况下 发现扫码枪发送的是ASCII码 一个AXCII码是由8个二进制数组成的 所以我将 "Data.接收的数据" 的类型改为Array[1..200] of Byte
结果进行一次扫码后数组里全是空的 但是数据接收显示已经完成 我就多扫了几次 结果发现只有在将数组全部填满时才会一次性都显示出来 这就造成了另外一个问题
当你的条形码长度为13时 200个长度的数组并不能刚好装下 结果就导致了最后一次扫码时超过200的数据会覆盖数组里前面的数值 文字说的不清楚 就用算式来说明一下
200 ÷ 13 = 15 余 5
当扫码15次时 数组不会显示数据
第16次扫码时 前5个数据填充在200长度数组的最后5位
剩余的8个数据则依次覆盖了从1开始的8个数据
因此 在读条码前需要先确定要读条码的长度 然后建立相应长度的数组
造成这种现象的原因还没有搞清楚 客户也不关心这个 数据读出来后就把扫码枪拿走了 我也没用机会再去好好研究了
如果有网友也发现这个问题并且解决了 欢迎给我留言
发送和断开指令基本同上面两个一致 这里就不再做介绍了
/**********************************************************************************************************************************/
2020/9/28更新
关于之前提到的“最后一次扫码时超过200的数据会覆盖数组里前面的数值”
造成这种现象的原因是在没有将数组填满时 数据都是保存在缓冲区 只有充填的数据填满数组时 才会进行一次缓冲区刷新 将数据刷新到数组对应的内存中 也就是在这个时候数组才真正有值
对于这个问题的解决好像还没有什么很好的方法 在高级语言中 如C语言是有缓冲区刷新函数---fflush()的 但是1200好像没有这个功能函数 所以只能确定好要读取的数据的长度 再建立相应长度的数组