ЛОГОТИП Siemens! Данные ПЛК в неправильном порядке

#python #json #plc #siemens #snap7

Вопрос:

Итак, я получаю доступ к ЛОГОТИПУ Siemens! ПЛК для извлечения некоторых данных. Мне удалось сделать это со своим партнером по работе, но мы застряли на том, как сохраняются данные. Данные помечаются временем в словаре с выходными и входными байтами ПЛК. Но данные поступают в определенном порядке и помечаются временем в момент извлечения данных.

Теперь проблема в том, что метки времени и данные сохраняются не в том порядке, в котором поступают данные. Где-то в процессе он совершает ошибку (я думаю), но мы, похоже, не можем ее найти.

Вот код на Python, который мы используем:

 # initial testing to connect to a PLC
#connects to PLC save I/O into json format with timestamp
import snap7
import time
import ctypes
import math
import json

PLCip = "x.x.x.x" #input  ip
Port = 000 # input port
Rack = 0
Slot = 1
size_to_read = 100
datadb = (ctypes.c_uint8 * size_to_read)()

#creates client and connect to plc, returns true if connected
Client = snap7.client.Client()
Client.connect(PLCip, Rack, Slot)
print("Connected:", Client.get_connected())

#converts sum INT to bits
def access_bit(data, num):
    base = int(num // 8)
    shift = int(num % 8)
    return (data[base] amp; (1<<shift)) >> shift

#empty dict for storing I/O data
mydata = {}

#save data dict to json format
def save_to_file(stamp, input, output, file):
    mydata[stamp] = {'input': input, 'output': output}
    with open(file,'a') as f:
        json.dump(mydata, f)

while True:
    # ts = time.time()    #gets current time 
    _now = time.time()
    ts = time.localtime(_now)
    # timestamp = (time.strftime('%H:%M:%S',ts),str('%.3f'%_now).split('.')[1])
    timestamp = time.strftime('%X',ts)
    datestamp = time.strftime('%d-%m-%Y',ts)
    log_folder='logs/'
    color=['black/','orange/','metal/']

    #json_file = str(log_folder) str(datestamp) '-' str(timestamp) '.json'
    json_file = str(log_folder) str(color[2]) str(datestamp) '.json'

    data = Client.eb_read(0,2)  # reads input data from 2 bytes
    data_input = format(int.from_bytes(data, "little"), "b")    #converts from int to bits

    outputdata = Client.ab_read(0,2)    #reads output data from 2 bytes
    data_output = format(int.from_bytes(outputdata, "little"), "b")    #converts from int to bits

    #save it to json file with parameters
    save_to_file(timestamp,data_input,data_output, json_file)
    #print to cli for debugging
    print_text= "Time: {}nInput: {}nOutput: {}n".format(timestamp,data_input,data_output)
    print(print_text)
    #wait 1 second and restart
    time.sleep(1)

 

И данные, которые мы получаем:

 {"13:41:57": {"input": "1001010000", "output": "0"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", "output": "0"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", "output": "0"}, "13:42:00": {"input": "1001010000", "output": "0"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", "output": "0"}, "13:42:00": {"input": "1001010000", "output": "0"}, "13:42:01": {"input": "1001010000", "output": "1001"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", "output": "0"}, "13:42:00": {"input": "1001010000", "output": "0"}, "13:42:01": {"input": "1001010000", "output": "1001"}, "13:42:02": {"input": "1010010000", "output": "101"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", "output": "0"}, "13:42:00": {"input": "1001010000", "output": "0"}, "13:42:01": {"input": "1001010000", "output": "1001"}, "13:42:02": {"input": "1010010000", "output": "101"}, "13:42:03": {"input": "1010010000", "output": "101"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", "output": "0"}, "13:42:00": {"input": "1001010000", "output": "0"}, "13:42:01": {"input": "1001010000", "output": "1001"}, "13:42:02": {"input": "1010010000", "output": "101"}, "13:42:03": {"input": "1010010000", "output": "101"}, "13:42:04": {"input": "1001010000", "output": "0"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", "output": "0"}, "13:42:00": {"input": "1001010000", "output": "0"}, "13:42:01": {"input": "1001010000", "output": "1001"}, "13:42:02": {"input": "1010010000", "output": "101"}, "13:42:03": {"input": "1010010000", "output": "101"}, "13:42:04": {"input": "1001010000", "output": "0"}, "13:42:05": {"input": "1001010001", "output": "1001"}}{"13:41:57": {"input": "1001010000", "output": "0"}, "13:41:58": {"input": "1001010000", "output": "0"}, "13:41:59": {"input": "1001010000", 
 

Это одно непрерывное выполнение сценария. Как вы можете видеть, временные метки на самом деле не в порядке.
Может ли кто-нибудь помочь нам решить эту проблему. Может быть, вы, ребята, видите что-то, чего не вижу я.

Большое спасибо!

Комментарии:

1. Попробуйте задать свой вопрос с помощью support.industry.siemens.com/tf/ww/en/conf/65 . Есть также статьи о логотипе и Python.

2. Спасибо, я сделаю это для дальнейшего использования. Это была скорее ошибка программирования. Я был привязан к этому в течение 2 недель и не мог понять, почему это не сработало. Но я решил ее сейчас!

Ответ №1:

Я выяснил, почему он так дублировал пакеты данных. Поскольку dict данные определены вне цикла while,он продолжает добавлять новые ключи, значения в dict . Он dict упаковывается в файл json и продолжает экспоненциально увеличиваться.

dict Данные должны быть определены внутри цикла while, чтобы их можно было использовать повторно каждый раз dict , когда они загружаются в json.

 ...
#save data dict to json format
def save_to_file(stamp, input, output, file):
    mydata[stamp] = {'input': input, 'output': output}
    with open(file,'a') as f:
        json.dump(mydata, f)

while True:
    mydata={}
    # ts = time.time()    #gets current time 
    _now = time.time()
    ts = time.localtime(_now)
    # timestamp = (time.strftime('%H:%M:%S',ts),str('%.3f'%_now).split('.')[1])
    timestamp = time.strftime('%X',ts)
    datestamp = time.strftime('%d-%m-%Y',ts)
    log_folder='logs/'
    color=['black/','orange/','metal/']
...