本文使用树莓派实现MODBUS RTU从机,借助python库——modbus-tk实现RTU从机。 MODBUS是一种灵活可靠的工业通信协议,常用的MODBUS协议包括MODBUS RTU和MODBUS TCP。借助python强大的库函数,可以在树莓派平台上非常方便的实现MODBUS主机和从机,MODBUS RTU和TCP,甚至一个树莓派既可以跑MODBUS RTU主机也可以同时跑MODBUS TCP从机。相比于其他平台(例如STM32),在树莓派上实现modbus真的太简单了。 假设树莓派8个可用GPIO端口分别连接LED,在很多工控领域一个LED可称为控制点,在modbus协议中一个控制点被抽象为线圈寄存器,操作相应的线圈寄存器有05H和15H指令。若使用modbus-tk便不必关心modbus协议的具体内容。 下面就通过modbus中协议实现树莓派扩展板上LED的控制。
- #!/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()
复制代码测试图片:
|