树莓派用PYTHON库实现MODBUS总线通讯

前言

在嵌入式领域经常会用到总线通讯,而这个总线通讯在行业里用的最多的应该就是由施耐德公司提倡的ModBus总线通讯了,这个总线通讯方式是上个世纪1979年第一个用于工业生产的现场环境的协议。在总线通讯上只有一个主机,总线上所有的通讯信息都是这个主机发出来的,在这个总线网络上最多可以支持248个设备。下面我们牛人技术就为大家介绍下如何在树莓派下实现MODBUS总线通讯。

树莓派用PYTHON库实现MODBUS总线通讯

MODBUS总线通讯的特点

1)它是目前嵌入式行业使用非常普遍支持比较好的总线通讯协议。
2)它是施耐德提倡的一个开放的标准通讯,大家都可以免费自用或商用。
3)总线通讯数据格式非常的简单易懂,开发相应的硬件非常方便。
4)总线支持多种电气性不同的接口,比如串口和485通讯等等。



在树莓派上安装modbus-tk库

首先确定你的树莓派PYTHON版本至少是2.5版本以上的,这里可以使用PYTHON -v命令查看你树莓派上的版本信息。
然后就可以从官网上下载modbus tk的压缩包了,下载完成后使用命令python setup.py install即可安装。
最后完成安装后可以在树莓派命令提示符下输入import modbus_tk来包含这个库,如果没有提示错误则说明包含库成功。



编写PYTHON代码来使用mudbus协议

这里我们采用8个树莓派GPIO接口分别连接到LED灯上来进行点亮和关闭的基本操作,因为这个LED灯在实际的生产环境下可以改成你自己需要的控制器。而且在在modbus协议中一个控制点被抽象为线圈寄存器,操作相应的线圈寄存器有05H和15H指令。所以我们在使用modbus tk这个时就不用去关心底层的modbus如何实现的具体细节了。不多说,下面来直接看控制modbus的代码。
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
import logging
import threading
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus as modbus
import modbus_tk.modbus_rtu as modbus_rtu
import serial
import time
import RPi.GPIO as GPIO
logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")
# 创建server
server = modbus_rtu.RtuServer(serial.Serial("/dev/ttyAMA0", 9600))
slaver = server.add_slave(1)
# BCM GPIO编号
pins = [17,18,27,22,23,24,25,4]
def setup():
# 采用BCM编号格式比较通用
GPIO.setmode(GPIO.BCM)
# 设置所有GPIO为输出状态,且输出低电平,通过电平信息来区别
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
slaver.add_block("coil", cst.COILS, 0, 16)
slaver.set_values("coil", 0, 16*[0])
def loop():
logger.info("running...")
# 启动从机开始接受信息
server.start()
while True:
values = slaver.get_values("coil", 0, 8)
#print values[0]
for i in range(0, 8):
if values[i] == 1:
GPIO.output(pins[i], GPIO.HIGH)
else:
GPIO.output(pins[i], GPIO.LOW)
# 必要的延时这里以毫秒为单元
time.sleep(0.5)
def destory():
logger.info("destory")
for pin in pins: GPIO.output(pin, GPIO.LOW)
GPIO.setup(pin, GPIO.IN)
# 停止从机
server.stop()
if __name__ == "__main__":
setup()
try:
loop()
except KeyboardInterrupt:
destory()

树莓派用PYTHON库实现MODBUS总线通讯

总结

这次树莓派实现的MODBUS总线通讯功能还是非常简单,主要是为大家做一个基础功能的演示。在代码中server = modbus_rtu.RtuServer(serial.Serial("/dev/ttyAMA0", 9600))这里设置的通讯的频率,需要更具你自己的具体通讯频率设置。

Syndicate content