s7

您所在的位置:网站首页 扫码枪数据传输 s7

s7

2023-11-11 07:40| 来源: 网络整理| 查看: 265

前段时间因为客户需求 让我调试一个霍尼韦尔扫码枪 要走以太网通信

之前调的扫码枪基本都是走串口 在网上没查到什么资料 虽然有些小问题 但是最后也算调出来了

后来又遇到一些同行询问扫码枪走以太网的方式 索性就写一篇小教程吧 

知识有限 难免出错 欢迎指出

 

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好像没有这个功能函数 所以只能确定好要读取的数据的长度 再建立相应长度的数组



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3