虹科工业树莓派是一款基于树莓派计算模块进行工业级设计和封装的,并且经过工业标准测试(EN61131-2和IEC 61000-6-2),如EMI,浪涌和突发事件等等,有ESD的极性保护,达到4KV/8KV。
虹科工业树莓派的操作系统在Raspbian基础上进行了优化,给linux内核添加了RT实时补丁,以使得linux满足硬实时的需求。
“ 02 / Modbus TCP/RTU主从站功能 ”
虹科工业树莓派内置虚拟Modbus TCP/RTU主从站功能,用户可以通过产品上的USB接口(需要USB转接线)/RS485接口连接Modbus RTU设备,并对设备进行读写操作。
用户可以在网页配置界面PiCtory中对虚拟主从站进行配置。
比如:配置Modbus RTU Master一个任务为每1000ms读取一次从站地址为1,寄存器地址为1的保持寄存器的值,并将读取到的值放入Input_Word_1中,配置好之后读取操作将自动执行,用户只需读取Input_Word_1的值即可获得相应数据。
在配置Modbus RTU Master时需要输入通过USB口连接的从站的设备编号的路径,比如:/dev/ttyUSB0。
但这就带来一个问题:当从站通过USB口连接到模块时,其设备端口号是系统自动分配的,Linux内核会根据设备插入的先后顺序进行编号的分配,比如第一个插入的设备编号是ttyUSB0,第二个插入的设备编号是ttyUSB1,依次类推。
所以,在每次重启系统之后,连接的Modbus RTU从站的设备编号可能会发生变化,上一次启动时是ttyUSB0,下一次启动就可能变成ttyUSB1。
如果每次启动设备都要检查和修改设备编号路径的话就会在实际应用中带来很多麻烦,那么有没有一种方法可以固定设备编号呢?
答案是肯定的!
我们可以通过指定udev规则,让udev除了产生/dev/ttyUSB*设备文件外,另外再创建一个软链接。具体操作见下文。
“ 03 / udev规则-通过芯片的特定码创建软链接 ”
Vender ID和Product ID,即“厂家标识”和“产品标识”。USB 设备驱动的硬件接口需要识别Vender ID和Product ID。
可以通过lsusb命令查看当前通过USB接入的设备的描述列表,就可以得到设备的Vender ID和Product ID,然后在进行后续绑定。
图2.1 lsusb命令
从上图可以看到,我通过USB口连接的USB-Serial adapter设备的Vender ID是1a86,Product ID是7523。接下来,在/etc/udev/rule.d目录下创建新的规则文件ttyUSBLink.rules。并输入以下规则:
KERNEL==”ttyUSB*”, ATTRS{idVendor}==”1a86”, ATTRS{idProduct}==”7523”, MODE:=”0666”, GROUP:=”dialout”, SYMLINK+=”modbus_device_1”
保存并退出文件,重新拔插USB设备,新建的udev规则即可生效(若没有生效,以root权限运行命令:service udev reload和service udev restart)。
以上述规则为例,以后无论按照什么顺序插入,都能够通过自定义的modbus_device_1设备文件软链接访问设备,而无需关心系统分配给设备的ttyUSB*的编号是什么。
图2.2 udev规则效果
从上图可以看出,系统自动为我的设备分配的编号是ttyUSB0,同时也创建了一个名为modbus_device_1的软链接,这样就可以在PiCtory界面直接输入软链接的路径。
但很多时候,设备厂商由于一些特殊原因,在串口芯片上写入的设备号是相同的:
图2.3 具有相同ID的USB串口设备
那么这种创建软连接的方法就会出问题,此时我们就需要另一种方法,详见下一部分。
“ 04 / udev规则-绑定硬件端口号 ”
如上文所说,我们可能会遇到具有相同ID号的设备,此时通过绑定ID号创建软链接的方法就行不通了,但可以通过绑定硬件端口号实现同样的效果。
每个设备的硬件端口号是不一样的,可以通过udevadm info --attribute-walk --name=/dev/ttyUSB0查看设备的硬件端口号:
图3.1 查看设备硬件端口号
通过上述命令,可以看到我的ttyUSB0设备的硬件端口号是1-1.2:1.0,ttyUSB1设备的硬件端口号是1-1.3:1.0。
然后修改一下ttyUSBLink.rules文件,改为以下规则:
图3.2 绑定硬件端口号udev规则
保存并退出后,重新拔插设备就可以看到生成的两个软链接:
图3.3 udev规则效果
需要注意的是,这里涉及的硬件端口号对应的是USB端口而不是USB端口上连接的设备。也就是说,假如你有左右两个USB端口,左边USB端口的端口号是1-1.2:1.0,右边USB端口的端口号是1-1.3:1.0。那么,插入左边USB端口的设备对应的软链接就是modbus_device_1,插入右边USB端口的设备对应的软链接就是modbus_device_2。
责任编辑:haq
全部0条评论
快来发表一下你的评论吧 !