I want to connect a Python Gekko application to a real-time system. For each "cycle" of the controller there are three steps:
current values are read from the measurement devices
the Python application creates a new move plan based on the measurements and a predictive model
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?
解决方案
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.