Привет, ребята, я работаю над сценарием, который будет получать данные от хоста, используя Стандарт передачи данных (Разработано: Отдел обработки линз Комитета по стандартизации передачи данных Совета по видению ) через последовательный порт и передать данные в протокол ModBus, чтобы устройство выполняло свои операции.
Поскольку с финансовой точки зрения у меня нет доступа к хост-машине, я пытаюсь разработать вторичный скрипт для эмуляции хоста. В настоящее время я нахожусь на стадии, когда мне нужно прочитать много информации из последовательного порта, и я получаю только часть данных. Я надеялся получить всю строку, отправленную функцией send_job () в моем сценарии эмулятора хоста.
Ребята, может ли кто-нибудь из вас сказать мне, будет ли это хорошим подходом? единственное, что должна делать машина, - это брать 2 значения из ответа хоста и назначать их двум регистрам хранения Modbus.
ПРИМЕЧАНИЕ. функция инициализации жестко запрограммирована, потому что она всегда будет одинаковой, а фактические данные ответа не будут иметь значения, за исключением статуса. Кроме того, запрос задания жестко запрограммирован, я передаю только задание №, которое я получаю из регистра хранения Modbus, точная логика того, как хост решил это, не имеет значения, мне нужно только отправить номер задания, отсканированный с устройства в этом формате.
основной скрипт:
def request_job_modbus(job):
data = F'[06][1c]req=33[0d][0a]job={job}[0d][0a][1e][1d]'.encode('ascii')
writer(data)
def get_job_from_serial():
response = serial_client.read_all()
resp = response.decode()
return resp
# TODO : SEND INIT SEQUENCE ONCE AND VERIFY IF REQUEST status=0
initiation_request()
init_response_status = get_init_status()
print('init method being active')
print(get_init_status())
while True:
# TODO: get job request data
job_serial = get_job_from_serial()
print(job_serial)
сценарий эмуляции хоста:
def send_job():
job_response = '''[06][1c]ans=33[0d]job=30925[0d]status=0;"ok"[0d]do=l[0d]add=;2.50[0d]ar=1[0d]
bcerin=;3.93[0d]bcerup=;-2.97[0d]crib=;64.00[0d]do=l[0d]ellh=;64.00[0d]engmask=;613l[0d]
erdrin=;0.00[0d]erdrup=;10.00[0d]ernrin=;2.00[0d]ernrup=;-8.00[0d]ersgin=;0.00[0d]
ersgup=;4.00[0d]gax=;0.00[0d]gbasex=;-5.30[0d]gcrosx=;-7.96[0d]kprva=;275[0d]kprvm=;0.55[0d]
ldpath=\\uscqx-tcpmain-at\lds\iot\do\800468.sdf[0d]lmatid=;151[0d]lmatname=;f50[0d]
lnam=;vsp_basic_fh15[0d]sgerin=;0.00[0d]sgerup=;0.00[0d]sval=;5.18[0d]text_11=;[0d]
text_12=;[0d]tind=;1.53[0d][1e][1d]'''.encode('ascii')
writer(job_response)
def get_init_request():
req = p.readline()
print(req)
request = req.decode()[4:11]
# print(request)
if request == 'req=ini':
print('request == req=ini??? <<<<<<< cumple condicion y enviala respuesta')
send_init_response()
send_job()
while True:
# print(get_init_request())
get_init_request()
что я вижу на экране: основной сценарий
init method being active
bce
erd
condition was met init status=0
outside loop
ers
condition was met init status=0
inside while loop
trigger reset <<<--------------------
5782
`:lmatid=;151[0d]lmatname=;f50[0d]
lnam=;vsp_basic_fh15[0d]sgerin=;0.00[0d]sgerup=;0.00[0d]sval=;5.18[0d]text_11=;[0d]
text_12=;[0d]tind=;1.53[0d][1e][1d]
outside loop
condition was met init status=0
outside loop
что я вижу на экране: сценарий эмуляции хоста
b'[1c]req=ini[0d][0a][1e][1d]'
request == req=ini??? <<<<<<< cumple condicion y enviala respuesta
b''
b'[06][1c]req=33[0d][0a]job=5782[0d][0a][1e][1d]'
b''
b''
b''
b''
b''
b''
read_all
методом из pyserial. В общем, мне интересно, как вы собираетесь собирать все данные. при относительно низкой скорости 9,6 кбод вам может потребоваться некоторое время читать, чтобы убедиться, что вы захватили весь свой вывод. Кроме того, вы можете столкнуться с ограничениями, связанными с размером буфера устройства tty, поэтому чтение этого относительно большого сообщения за один раз (один вызовread
). - person Aaron   schedule 09.10.2018