Link IoT Edge提供Modbus官方驱动,用于支持工业领域广泛应用的Modbus通信协议设备。本文主要介绍Modbus驱动及其用法。
概览
Modbus是常用的应用层数据通信协议,阿里云官方Modbus驱动(以下简称Modbus驱动)支持Modbus RTU和Modbus TCP两种交互。
Modbus驱动支持的功能有读取输入状态和输入寄存器、读取和写入线圈状态、保持寄存器。
Link IoT Edge提供C和Python语言Modbus驱动,同时根据CPU架构的不同,有多种C语言Modbus驱动。您可以直接从控制台部署Modbus驱动到网关,也可以从控制台下载Modbus驱动代码进行修改,作为您的自定义驱动使用。
本文以示例方式介绍Modbus官方驱动的使用步骤,具体操作如下文所示。
前提条件
请确保已创建边缘实例并上线网关,具体操作请参见环境搭建。
一、分配驱动
- 登录边缘计算控制台。
- 左侧导航栏单击边缘实例,在已创建的边缘实例右侧单击查看。
- 在实例详情页面设备与驱动页签下,单击全部驱动右侧的
+
图标 。 - 在分配驱动面板中,选择官方驱动,根据网关CPU架构选择需要使用的Modbus驱动,单击对应操作栏中的分配。然后单击关闭。说明
- C语言Modbus驱动,需在v1.8.4及以上版本的Link IoT Edge中使用。
- Python语言Modbus驱动,仅支持在Link IoT Edge专业版中使用。
二、配置驱动
- 单击已分配的Modbus驱动,在设备列表右侧单击驱动配置。
- 在弹出面板中单击添加通道。通道是网关与具体物理设备之间的连接介质。
- 根据界面提示设置参数,然后单击确定。
参数 描述 通道名称 设置通道名称,需在网关维度具有唯一性。支持中文汉字、英文字母、数字和下划线(_),长度不超过1~30个字符,1个中文汉字算2个字符。 传输模式 支持RTU和TCP两种。
当传输模式为RTU时,需设置以下参数: 串口 设置串口,如/dev/ttyUSB0、/dev/ttyUSB1。支持英文字母、数字、正斜杠(/)和下划线(_),长度限制1~64字符。 波特率 表示每秒传送的符号个数,从下拉列表中选择。 数据位 表示一组数据实际包含的数据位数,从下拉列表中选择。 校验位 从下拉列表中选择奇偶校验、或者无校验。 停止位 用于表示单个包的最后一位,从下拉列表中选择。 当传输模式为TCP时,需设置以下参数: IP地址 Modbus设备IP地址,输入点分十进制格式的地址。 端口号 Modbus设备端口号,输入1~65535范围的整数。 - (可选)在设备列表右侧,单击容器配置,根据如下参数说明,对当前驱动进行容器配置。配置完成后单击保存。 说明 仅在产品规格为专业版的边缘实例中,允许设置容器配置。
参数 描述 是否使用宿主机host模式 选择是否隔离容器的网络。直接使用宿主机网络环境。 - 是:表示不隔离容器的网络,直接使用宿主机网络环境。
- 否:表示隔离容器的网络,需要设置网络端口映射。
网络端口映射 当是否使用宿主机host模式为否时出现的参数。函数的网络环境和宿主机的环境是完全隔离的。通过网络端口映射,将容器内函数的监听端口映射到宿主机的某一个端口上,实现不同主机上的客户端程序,能够访问该函数提供的服务。最多支持映射10条网络端口。 例如,运行在宿主机容器内的
fc-http-server
函数,通过80端口对外界提供服务。此时,其它主机上的客户端程序,无法通过访问宿主机的80端口,访问到fc-http-server
函数。因此需要将fc-http-server
函数所在的容器端口映射到宿主机的某一个端口上(例如将容器内的80端口映射到宿主机8080端口),允许其它主机上的客户端程序通过访问宿主机的IP地址:8080
,访问到容器内部的fc-http-server
函数。是否启动特权模式 容器内的root用户实际上只是宿主机的一个普通用户。若在容器内部做修改系统时间、使用mount命令等需要root权限的操作,则需要赋予容器privileged特权。
说明 特权模式下,容器内部拥有宿主机的root权限,而且宿主机的所有设备会默认映射到容器内部,即无需配置设备映射。设备映射 当是否启动特权模式为否时出现的参数。设备管理系统和宿主机的环境是完全隔离的。当一个函数需要访问宿主机的设备(例如串口)时,需要将设备映射到运行函数的容器内部。最多可添加10个设备映射。 卷映射 文件系统和宿主机的环境是完全隔离的。当一个函数需要访问宿主机的文件时,需要将文件映射到运行函数的容器内部。最多可添加10个卷映射。
三、驱动关联子设备
- 单击设备列表区域框下的分配子设备,在Modbus驱动下为边缘实例分配设备。您可以分配已有的Modbus设备,也可以根据下面的步骤,新建Modbus设备。说明 分配已有的Modbus设备时,该设备所属产品必须接入网关,且接入网关协议为Modbus。详细说明请参见创建产品。
- 在右侧弹出的分配子设备面板中,单击添加子设备。
- 在添加设备对话框,单击新建产品,创建Modbus设备所属产品。
- 在创建产品对话框设置参数后,单击完成。
表 1. 参数说明 参数 描述 产品名称设置产品名称,产品名称在账号内具有唯一性。支持中文、英文字母、数字、下划线(_)、短划线(-)、at符号(@)和英文圆括号,长度限制4~30个字符,一个中文汉字算2个字符。 接入网关协议此处必须选择Modbus。 认证方式选择适合您设备的认证方式。详细信息,请参见设备安全认证。产品描述 添加对该产品的描述。可以为空。 - 在添加设备对话框,产品自动分配已创建的产品,单击产品下的前往配置,为产品添加自定义功能。说明 您也可以使用Modbus调试工具配置Modbus产品,但需要先完成添加设备并分配到边缘实例的操作,再使用调试工具。
系统跳转到物联网平台控制台的产品详情页面功能定义页签。单击编辑草稿,在弹出页面中单击添加自定义功能。
- 在添加自定义功能对话框,根据实际情况设置属性参数。具体操作请参见单个添加物模型。在配置物模型属性的过程中,单击新增扩展描述设置如下扩展描述参数,将属性映射到寄存器中。官方Modbus驱动会将所有的属性聚合为Modbus数据请求,驱动收到Modbus数据之后再转换为物模型数据。
参数说明如下所示,详细的参数解释请参见单个添加物模型中“扩展描述”的说明。
名称 描述 操作类型 指操作Modbus的功能码。 说明 其中:- 线圈状态:读取时统一使用0x01功能码。写入时支持使用单个写入功能码0x05,或多个写入功能码0x0F。
- 保持寄存器:读取时统一使用0x03功能码,写入时支持使用单个写入功能码0x06,或多个写入功能码0x10。
- 写入时选择0x06:原始数据类型参数下只可选择int16或者uint16。选择其它数据类型时,上报属性数据会报错。
- 写入时选择0x10:原始数据类型参数下所有数据类型都可选。
- 离散输入:读取时统一使用0x02功能码,该类型不支持写入。
- 输入寄存器:读取时统一使用0x04功能码,该类型不支持写入。
Modbus协议相关规范,请参见GB/T 19582.1-2008、GB/T 19582.2-2008和GB/T 19582.3-2008。
寄存器地址 填写十六进制,以 0x
开头。根据您自己设备的属性地址设置寄存器地址。例如,要调试温度属性,您设备的温度属性地址为1,则寄存器地址可设置为0x1。
原始数据类型 如采集的温度值的数据类型为浮点型。 取值范围 取值范围指的是原始数据经过缩放因子处理之后的取值范围,超出取值范围的数据会被丢弃。 交换寄存器内高低字节 是否把寄存器内16位数据的前后8个bits互换。此处设置为互换true。 交换寄存器顺序 是否把原始数据32位数据的bits互换。此处设置为不互换false。 缩放因子 指缩放系数,如采集的值为100, 但真实的值为10,因此需要缩放10倍,故缩放因子填写0.1即可。如放大10倍(即真实的值为1000),则放大因子为10。 数据上报方式 有两种数据上报方式。 - 按时上报:选择按时上报后,根据步骤9中为子设备设置的数据采集间隔,采集数据并上报。
- 变更上报:采集后的值发生变化后才会上报。
- 返回实例详情页面,添加Modbus设备。
- 将新建的Modbus设备分配到边缘实例。
- 分配设备到边缘实例后,单击设备名称对应操作栏中的设备配置,通过关联通道,关联设备与Modbus驱动。
表 2. 参数说明 参数 描述 关联通道 选择配置驱动步骤2中已创建的通道。 从站号 从站号是Modbus设备标识信息,在同一个通道中是唯一的。 数据采集间隔 Modbus协议是半双工协议,由网关主动请求数据,因此需要指定对数据点的采集间隔时间。单位为毫秒。 说明 单个属性点的采集耗时时间大概为60毫秒(ms),则采集间隔的计算方式为:
例如,当前Modbus总线通道上有10个设备,且每个设备有10个属性点,即采集间隔时间应大于等于6000 ms(60 ms * 10 * 10 = 6000 ms),这样才能保证每个属性点能正常上报。采集耗时时间(60 ms) * 该通道的所有属性点个数
四、部署边缘实例
- (可选)在部署实例前,可以使用Modbus调试工具,测试网关能否连接该Modbus设备,同时也可以测试Modbus设备所属产品的物模型是否配置正确。
- 在实例详情页面,单击右上角部署,部署边缘实例。
常见问题
Modbus官方驱动上报消息到云端时,是按照设备维度上报,还是属性维度上报?
答:Modbus官方驱动在每个采集周期内,按照设备维度进行采集和上报数据。例如,1个Modbus设备有100个属性,数据采集间隔为5秒,那么Modbus驱动每5秒上报云端1条消息(因为是1个设备)。