How do you implement a Python Gekko application for real time systems? [closed]

陌路散爱 提交于 2019-12-12 13:37:40

问题


I want to connect a Python Gekko application to a real-time system. For each "cycle" of the controller there are three steps:

  1. current values are read from the measurement devices
  2. the Python application creates a new move plan based on the measurements and a predictive model
  3. the move plan is re-inserted into the physical process

A visualization of the process is shown in this video or from this frame still.

For connection to real-time systems, the client must read and write values. What are standard communication protocols for connecting to process control systems such as a Distributed Control System (DCS) or Programmable Logic Controller (PLC) in Python?


回答1:


Python can read and write values from MODBUS, OPC, and with SQL or other protocols. Here is example code for Modbus (pymodbus) and OPC (OpenOPC).

OPC Example in Python

# #######################################
# OPC write
# #######################################
try:
    # OPC connection
    import OpenOPC
    opc=OpenOPC.client()
    b=opc.connect('Kepware.KEPServerEX.V5')
    #opc.connect('Kepware.KEPServerEX.V5','localhost')

    Load1_avg  = opcm[0][0]
    Load2_avg  = opcm[0][1]
    Load3_avg  = opcm[0][2]
    Load4_avg  = opcm[0][3]
    Load1_max  = opcm[1][0]
    Load2_max  = opcm[1][1]
    Load3_max  = opcm[1][2]
    Load4_max  = opcm[1][3]
    Load1_min  = opcm[2][0]
    Load2_min  = opcm[2][1]
    Load3_min  = opcm[2][2]
    Load4_min  = opcm[2][3]
    Load_T12   = opcm[3][0]
    Load_T21   = opcm[3][1]
    Load_T32   = opcm[3][2]
    Load_T41   = opcm[3][3]

    opc.write( ('Channel2.Device1.T_12_Load_AVG',Load1_avg) )
    opc.write( ('Channel2.Device1.T_21_Load_AVG',Load2_avg) )
    opc.write( ('Channel2.Device1.T_32_Load_AVG',Load3_avg) )
    opc.write( ('Channel2.Device1.T_41_Load_AVG',Load4_avg) )
    opc.write( ('Channel2.Device1.T_12_Load_MAX',Load1_max) )
    opc.write( ('Channel2.Device1.T_21_Load_MAX',Load2_max) )
    opc.write( ('Channel2.Device1.T_32_Load_MAX',Load3_max) )
    opc.write( ('Channel2.Device1.T_41_Load_MAX',Load4_max) )
    opc.write( ('Channel2.Device1.T_12_Load_MIN',Load1_min) )
    opc.write( ('Channel2.Device1.T_21_Load_MIN',Load2_min) )
    opc.write( ('Channel2.Device1.T_32_Load_MIN',Load3_min) )
    opc.write( ('Channel2.Device1.T_41_Load_MIN',Load4_min) )
    opc.write( ('Channel2.Device1.T_12_Load_INST',Load_T12) )
    opc.write( ('Channel2.Device1.T_21_Load_INST',Load_T21) )
    opc.write( ('Channel2.Device1.T_32_Load_INST',Load_T32) )
    opc.write( ('Channel2.Device1.T_41_Load_INST',Load_T41) )

    opc.close()
except:
    print 'OPC communication failed'
    pass

MODBUS Example in Python

# #######################################
# Modbus write
# #######################################
try:
    # import the various server implementations
    from pymodbus.client.sync import ModbusTcpClient as ModbusClient
    from pymodbus.constants import Endian
    from pymodbus.payload import BinaryPayloadBuilder
    from pymodbus.client.sync import ModbusTcpClient as ModbusClient
    from pymodbus.payload import BinaryPayloadDecoder

    # initiate client
    ##client = ModbusClient('192.168.0.1')
    client = ModbusClient(host='localhost', port=502) 
    slave_address = 0

    # AVG Registers Modbus 40001,3,5,7
    # MAX Registers Modbus 40009,11,13,15
    # MIN Registers Modbus 40017,19,21,23
    # INST Registers Modbus 40025,27,29,31
    # registers
    reg = 0
    # AVG, MAX, MIN, INST
    for i in range(0,4):
        # Channels
        for j in range(0,4):
            builder = BinaryPayloadBuilder(endian=Endian.Little)
            builder.add_32bit_float(opcm[j][i])
            payload = builder.build()
            result  = client.write_registers(int(reg), payload, skip_encode=True, unit=int(slave_address))
            # two registers for floating point numbers
            reg = reg + 2
    client.close()
except:
    print 'Modbus communication failed'
    pass

Besides MODBUS and OPC, there are also other text based file transfers and other methods of communication supported by companies although these are the most common in oil and gas industries where they have a Distributed Control System (DCS) or Programmable Logic Controller (PLC) that is for Scheduling and Data Aquisition (DAQ). There are about 140 instances of Gekko/APMonitor in industrial applications that I know about. Some of them are listed here.



来源:https://stackoverflow.com/questions/57085640/how-do-you-implement-a-python-gekko-application-for-real-time-systems

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!