Python3은 시리얼 서버[modbus_rtu_over_tcp]를 통해 장치의 Modbus 데이터를 읽습니다.

1. 프로젝트 배경:

산업용 획득 장비는 ModbusRtu 프로토콜을 지원하며 통신 포트는 232 직렬 포트 또는 485 인터페이스입니다.상단 컴퓨터는 획득 터미널에 연결되어 [직렬 포트 라인, 485 버스] 라우팅이 불편하고 기존 네트워크는 직렬 포트 서버를 통해 연결하는 데 사용됩니다.

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
구현 계획:
1. 가상 직렬 포트, 호스트 컴퓨터가 직렬 포트를 통해 데이터를 직접 수집 단점: 가상 직렬 포트 프로그램을 설치하고 열어야 불안정 요소가 증가하고 호스트 컴퓨터가 쉽지 않은 경우 리눅스 시스템이다.
여기에 이미지 설명 삽입

2、modbus_rtu_over_tcp,通过网络连接直接采集数据。不用加载虚拟串口,稳定性好,跨平台性强。

2. 함수 라이브러리 가져오기:

modbus_tk
여기에 이미지 설명 삽입

https://github.com/ljean/modbus-tk/

3. 코드 구현:

#!/usr/bin/env python
# -*- coding: utf_8 -*-
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu_over_tcp

import struct
import os
import time 

def main():
    
    master_1=modbus_rtu_over_tcp.RtuOverTcpMaster('172.16.1.22', 8023) # 建立Modbus主机连接  串口服务器
    master_1.set_timeout(5.0) #连接超时:5秒
    
    while True:
        
        try:
            data=master_1.execute(1, cst.READ_INPUT_REGISTERS, 0, 2) #读  输入寄存器
            print('读取 172.16.1.22:8023 串口服务器的数据')
            print(data)
            x=struct.unpack('>f',struct.pack('>I',(data[0]<<16)+data[1]))[0]   # 两个 双字节无符号整数 转成 浮点数
            x=round(x,2) #保留两位小数
            print(x)
                
        except:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            e=repr(traceback.format_exception(exc_type, exc_value, exc_traceback))
            print('172.16.1.22 数据读取发生异常') 
            print(e) 
            
        time.sleep(60) #采集频率 一分钟一次

if __name__ == "__main__":
    main()


4. 작동 효과:

여기에 이미지 설명 삽입

추천

출처blog.csdn.net/lzl640/article/details/129733725