[Modbus TCP/IP] Client/Server Module

Programming/Python|2020. 11. 10. 15:45
728x90
반응형

 

Modbus TCP/IP의 개념은 정리하여 올려드리겠습니다.

 

산업현장에서 EMS(Energy Management System) 또는 PMS(Power Management System)를 구현하기위해

 

고가의 License 비용을 지불하여 SCADA Tool을 구매해야 했던 경험이 있습니다.

(제 기억으로는 간단한 기능만 필요했음에도 비용이 발생했었습니다.)

 

Modbus 기기의 데이터를 다른 주소로 변환 가능 

 

아래의 간단한 알고리즘에 의해 Client/Server를 동시에 수행하게 됩니다.

 

모드버스 클라이언트/서버 동시 기능 구현

 

Open Sorce에서도 Client와 Server를 각각 구현해 놓은 경우는 종종 찾아 볼 수 있었지만

 

Client/Server를 동시에 구현하는 소스코드는 구하기가 어려워 직접 작성해보았습니다.

 

#!/bin/python
from pyModbusTCP.client import ModbusClient
from pyModbusTCP.server import ModbusServer, DataBank
from time import sleep
 
# Create an instance of Modbus Client
client_001 = ModbusClient(host="192.168.0.2", port=502, unit_id=1, debug=False)
 
# Create an instance of Modbus Server
server = ModbusServer(host="192.168.0.2", port=503, no_block=True, ipv6=False)
 
set_list_001 = [0]
get_list_001 = [0]
 
try:
    # Modbus TCP Server DataBack init.
    client_001.open()
    if client_001.is_open():
        read_list_001 = client_001.read_holding_registers(reg_addr=0, reg_nb=1)
        set_list_001 = read_list_001
 
        DataBank.set_words(address=0, word_list=read_list_001)
        get_list_001 = DataBank.get_words(address=0, number=1)
 
        client_001.close()
 
        print("Start server . . . ")
        server.start()
        print("Server is online")  
    else:
        print("Error with Client Port Open")
 
    while True:
        client_001.open()
        if client_001.is_open():
            read_list_001 = client_001.read_holding_registers(reg_addr=0, reg_nb=1)
 
            if set_list_001 != read_list_001:
                set_list_001 = read_list_001
                DataBank.set_words(address=0, word_list=read_list_001)
                client_001.close()
            elif DataBank.get_words(address=0, number=1) != get_list_001:
                get_list_001 = DataBank.get_words(address=0, number=1)
                client_001.write_single_register(reg_addr=0, reg_value=int(get_list_001[0]))
                client_001.close()
            else:
                client_001.close()
        else:
                print("port open error")
        sleep(1)
except ValueError:
    print("Shutdown server . . .")
    server.stop()
    print("Server is offline")

 

(단, Localhost PC에서 502번 포트에 Modbus TCP/IP Server를 에뮬레이터가 동작하고 있어야 합니다.)

반응형

댓글()