因自建公司Mes系统 需要读取s7-1200 HMI 数据
找到python-Snap7模块可以连接s7-1200读取数据
使用过程中发现Snap7.util不支持读取Dint Lreal ,但是struct支持读取int double
修改*\Python37\Lib\site-packages\snap7 下 util.py
def get_dint(bytearray_, byte_index):
"""
Get dint value from bytearray.
int are represented in 4 bytes
"""
data = bytearray_[byte_index:byte_index + 4]
data[1] = data[1] & 0xff
data[0] = data[0] & 0xff
packed = struct.pack('4B', *data)
value = struct.unpack('>i', packed)[0]
return value
def get_lreal(_bytearray, byte_index):
"""
Get lreal value. create double from 8 bytes
"""
x = _bytearray[byte_index:byte_index + 8]
lreal = struct.unpack('>d', struct.pack('8B', *x))[0]
return lreal
plc = snap7.client.Client()
plc.connect(str("192.168.0.2"),0,0)
bytes_response = plc.db_read(13,88,8) #读取总牵引长度
bytes_response_set_meter = plc.db_read(9,0,4) #读取设定长度
bytes_response_set_time = plc.db_read(36,4,4) #读取切割间隔时间
plc.disconnect()
response = [str(snap7.util.get_lreal(bytes_response, 0))]
response_set_meter = [str(snap7.util.get_real(bytes_response_set_meter, 0))]
response_set_time = [str(snap7.util.get_dint(bytes_response_set_time, 0))]
完成读取