欢迎光临![登录] [注册]
 信任登录:

扫描枪 > 霍尼韦尔Honeywell 扫描枪连接 Modbus 协议 PLC 的解决方案

霍尼韦尔Honeywell 扫描枪连接 Modbus 协议 PLC 的解决方案

发布者 :高自盟 发布时间:2024/11/28 18:04:50

本文来源:霍尼韦尔智能工业科技公众号


Xenon 系列、Granit 系列、3310 等支持 TotalFreedom 开发平台的扫描枪
解决方案:

一、扫描枪与 PLC 应用
Honeywell 设备与 PLC 的相关应用主要是扫描枪的应用,具体分为两类,一类是以 1900 为代表的扫描数据采集应用,一类是以 3310 为代表的控制扫描触发应用。

3310 EIO 版本不支持外部触发,大多数情况下使用传感器进行触发,而有的项目中也会使用 PLC 进行触发。由 PLC 接收传感器信号,然后输出高电平信号到 3310 的 pin14 引脚来触发扫描,或者通过控制继电器输出高电平信号进行触发。触发扫描完成后,条码数据经由通信线缆传递给 PLC,完成一次完整的扫描业务流程。

无论是以 1900 为代表的扫描数据采集应用,还是以 3310 为代表的控制扫描触发应用,主要技术门槛在于 PLC 对扫描数据的接收。

Honeywell 全线扫描设备都无法支持诸如 Profibus、Profinet、Modbus 等 PLC 通信协议,也就是说,除非 PLC 设备没有使用任何通信协议,否则,Honeywell 的扫描枪无法与 PLC 建立通信连接,PLC 也就无法接收扫描数据。

客观上来说,Honeywell 的扫描枪可以支持任何通信协议,只要将需要的通信协议集成到设备中即可。只是 Honeywell 官方出厂的扫描枪是没有支持的,我们可以使用 TotalFreedom 开发平台来实现。TotalFreedom 支持 Xenon 系列、Granit 系列、3310、7580 等主流 Honeywell 扫描产品,基本满足 PLC 项目应用需求。

二、PLC 通信协议
PLC 常见通信协议:

Rockwell: 使用 DF1 协议,可以通过 RS232 或 RS422 等串口介质进行数据传输,也可以通过 DH、DH+、DF485、ControlNet 等网络介质来传输。
GE: 使用 SNP 协议,也可以通过以太网连接,GE 的以太网协议内容不对外公开,但 GE 提供 SDK 开发包,可以基于该开发包进行通信。
西门子: 使用 Profibus(RS232 接口)和 Profinet 工业以太网总线协议,支持 MPI、PPI 和自由通讯口协议。
施耐德: 使用 Modbus 协议,Modbus 协议在工控行业得到了广泛的应用,支持传统的 RS-232、RS-422、RS-485 和以太网设备。
欧姆龙: 使用 Host Link(RS232 接口)和 Control Link 协议。
三菱: 使用 RS232、RS485 和以太网进行通信。
除上述主流厂家之外,其他厂家的设备主要使用 RS232、RS485 和 Modbus 协议进行通讯。
当遇到 Modbus 协议的通用需求,该 PLC 应用方案主要是针对 Modbus 协议进行开发。根据传输方式的不同,Modbus 协议可以分为 ASCII、RTU、TCP 三种模式,Modbus RTU 一般采用串口 RS232 或 RS485/422,Modbus TCP 一般采用以太网口。TCP 和 RTU 协议非常类似,只要把 RTU 协议的校验码去掉,然后在 RTU 帧的开始加上 5 和 0 和 1 个 6 并通过 TCP/IP 网络协议发送出去即可。

Modbus 协议需要对数据进行校验,ASCII 模式采用 LRC 校验,RTU 模式采用 16 位 CRC 校验,TCP 模式没有额外规定校验,因为 TCP 协议是一个面向连接的可靠协议。

具体 Modbus 消息帧可以参考下面的数据帧:

计算机发送命令:[设备地址][命令码 01][起始寄存器地址 8201][读取的寄存器数量 01][低 8 位][高 8 位][CRC 校验的低 8 位][CRC 校验的高 8 位]
例:[1][1][01][01][31][00][25][FC](低 8 位][高 8 位][CRC 校验)

意义如下:
<1> 设备地址:在一个 485 总线上可以挂接多个设备,此处的设备地址表示要和哪个设备通讯。例子中为地址 1 的设备的 17 号十六进制的 111 通讯。
<2> 命令码 01:读取寄存器的命令固定为 01。
<3> 起始地址高 8 位、低 8 位:表示要读取的开头寄存器的起始地址(起始地址为 0),比如例子中的起始地址为 19。
<4> 寄存器数量高 8 位、低 8 位:表示从起始地址开始读取多少个寄存器。例子中为 37 个寄存器。
<5> CRC 校验:是开头一直校验到此之前,在此协议的最后再作介绍。此处需要注意,CRC 校验在命令的最低字节的顺序和传输的相反。
二、TotalFreedom 实现方案
使用 TotalFreedom 开发平台可以通过软件编程实现 Modbus 协议帧,只需要将 Modbus 协议帧的实现方式填充到 int MatrixPluginDataEdit(DataEditParam *pFormatParam) 函数中即可。

Modbus 协议帧具体实现的源代码如下:

c
int MatrixPluginDataEdit(DataEditParam *pFormatParam)
{
    // Add your Format code here and copy the result back to pFormatParam->message
    unsigned int len = pFormatParam->messageSize; // 读取数据长度区域,单位为字节,代表不字节
    unsigned int size = pFormatParam->messageSize; // 数据长度区域,此地址的数据存放在下述
    if(size == 0)
    {
        len = 2; // 如果存储单位为字节,数据长度为 2 字节
    }
    unsigned char *pBuffer = (unsigned char *)malloc(len); // 存放 Modbus 协议数据帧
    pFormatParam->pBuffer = pBuffer; // PLC 设备地址
    pFormatParam->pStart = 0x01; // PLC 设备地址
    memcpy(pFormatParam->pData, pData, len); // 将寄存器数据复制到 pFormatParam->pData 的区域中

    unsigned int i, j;
    unsigned int crc = (unsigned int)(0xFFFF);
    for(i = 0; i < (len + 1); i++) // 计算 CRC 校验码
    {
        crc ^= (unsigned int)(pBuffer[i]);
        for(j = 0; j < 8; j++)
        {
            if(crc & 1)
            {
                crc >>= 1;
                crc ^= 0xA001;
            }
            else
            {
                crc >>= 1;
            }
        }
    }

    pBuffer[len++] = (unsigned char)(crc & 0xFF); // CRC 校验码低字节
    pBuffer[len++] = (unsigned char)((crc & 0xFF00) >> 8); // CRC 校验码高字节

    if(size == 0)
    {
        pFormatParam->messageSize = len; // 更新数据长度
    }
    else if(size == 0)
    {
        pFormatParam->messageSize = (len + 1) / 2; // 更新数据长度
        memcpy(pData, pBuffer, len + 1); // 更新数据内容
    }
    memset(pBuffer, 0, len + 1); // 清空数据
    free(pBuffer); // 释放内存

}

本文来源:霍尼韦尔智能工业科技公众号


相关文章
  • 品质保障 品牌厂家 官方授权
  • 无忧退货 完美售后 15天退货
  • 厂家直销 价格实惠 全网最低
  • 价格保护 买贵包退 实惠到家
  • 一件代发 无需囤货 省心省力

深圳市信华翰科技有限公司

公司地址: 深圳市福田区深南中路3007号国际科技大厦37楼

粤ICP备11079526号

深圳市市场监督管理局企业主体身份公示
扫一扫,快速进入扫描网微信商城!
扫一扫,加我为微信好友吧!