Просмотр полной версии : МВ110-224.8А modbus
сломал голову, как прочитать регистры по модбасу: конфигуратор работает, Modbus Poll работает. А простейший скрипт пайтона бьет ошибку пустого ответа.
import serial
ser = serial.Serial(None, 9600, timeout=1)
ser.port='COM5'
print ser
ser.open()
ser.write(':100300010001D68B\r\n')
print repr(ser.read(1000)) # Read 1000 bytes, or wait for timeout
ser.close()
Serial<id=0x209e070, open=False>(port='COM5', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)
''
я подозреваю ошибку конфигурирования порта. Чтение через CP210x
Подскажите куда копать?
Евгений Кислов
05.06.2017, 21:31
Вы пытаетесь опрашивать по Modbus ASCII, но контрольную сумму считаете как для Modbus RTU.
В Modbus ASCII контрольная сумма - это двухбайтовый LRC:
http://www.modbustools.com/modbus.html#lrc
Взял рту запрос с BaseBlock ComTest
Скорость конфигуратором поменял на 115200
import serial
ser = serial.Serial(None, 115200, timeout=1, rtscts=True)
ser.port='COM5'
print ser, ser.dtr, ser.rts
#ser.write(':100300010001D68B\r\n')
ser.open()
ser.read()
ser.write('\x10\x03\x00\x00\x00\x06\xC6\x89')
print repr(ser.read(1000)) # Read 1000 bytes, or wait for timeout
ser.close()
C:\Python27\python.exe C:/Users/Danil/PycharmProjects/modbus/serialtest.py
Serial<id=0x2ace0b0, open=False>(port='COM5', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=True, dsrdtr=False) True True
''
Process finished with exit code 0
А что это за программа такая ?
Взял рту запрос с BaseBlock ComTest
Скорость конфигуратором поменял на 115200
import serial
ser = serial.Serial(None, 115200, timeout=1, rtscts=True)
ser.port='COM5'
print ser, ser.dtr, ser.rts
#ser.write(':100300010001D68B\r\n')
ser.open()
ser.read()
ser.write('\x10\x03\x00\x00\x00\x06\xC6\x89')
print repr(ser.read(1000)) # Read 1000 bytes, or wait for timeout
ser.close()
C:\Python27\python.exe C:/Users/Danil/PycharmProjects/modbus/serialtest.py
Serial<id=0x2ace0b0, open=False>(port='COM5', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=True, dsrdtr=False) True True
''
Process finished with exit code 0
timeout равный единице это нормально?
Тайм-аут не менее, чем на модуле, это нормально. Методом тыка пришёл к тому, что чип не умеет автоматически переключать rts, буду экспериментировать с 485 режимом библиотеки serial
А что это за программа такая ? какая именно?
здесь (http://pyserial.readthedocs.io/en/latest/pyserial_api.html) вот написано про rs485_mode, который явно имеется физически а в программе нет настроек. И стоит при всех непонятных ситуациях использовать flush()
К сожалению flush не работал. Пробовал
а готовые библиотеки работают? https://stackoverflow.com/questions/17081442/python-modbus-library
Minimalmodbus пока не разбирался с 485. Верхний скрипт переключил в 485 и он начал отвечать. Вечером попробую овен пайтон библиотеку с изменённым классом порта под 485
Помогите разобраться не работает программа.
Один порт RS 485 чтение 1 переменная запись одна переменная
ПЛК73
(*Организуем счетчик, что бы передавать эти данные по сети*)
t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
IF A > 9999 THEN
A := 0;
END_IF
(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=115200; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=45;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
CASE process OF
0:
read_real(
Enable:=enable,
Mode:= MB_RTU,
DevAddr:=16 ,
FirstAddr:=261,
Quantity:=1,
ComHandle:=Settings.Port,
TimeOut:=TimeOut,
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err, (* скопировать регистр ошибок *)
ByteCnt=>DataSize);
IF cmpl THEN
IF err <>0 THEN
ptr_D:=ADR(d);
ptr_D^:=buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[0];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[2];
END_IF
END_IF
process:=1;(*переходим к выполнению следующего блока*)
1:
write_real(
Enable:= enable, (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=15 , (*адрес*)
FirstAddr:= 261, (*номер регистра*)
Quantity:= 1, (*количество записываемых регистров*)
ComHandle:=Settings.Port ,(*номер сом-порта*)
TimeOut:=TimeOut , (*таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
RegCnt=> DataSize); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
ptr_D:=ADR(d);
ptr_D^:=buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[0];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[2];
process:=0;
END_IF
END_CASE
IF enable = FALSE THEN
enable := TRUE;
END_IF
(*IF err <> 0 THEN
enable := FALSE;
END_IF*)
END_IF
Помогите разобраться не работает программа.
как Ваша программа связана с данной темой, лишь бы вбросить. И начните с того, что определитесь по какому адресу слейва Вы обращаетесь
с режимом rs485 все заработало: и модбас, и овен.
с виндоус все ок
однако raspbian вываливается с ошибкой конфигурирования RS485
ValueError: Failed to set RS485 mode: [Errno 25] Inappropriate ioctl for device
как Ваша программа связана с данной темой, лишь бы вбросить. И начните с того, что определитесь по какому адресу слейва Вы обращаетесь
Программа для связи ПЛК73 с модулем ввода МВ110 8АС этим связана.
как Ваша программа связана с данной темой, лишь бы вбросить. И начните с того, что определитесь по какому адресу слейва Вы обращаетесь
Для чтения с модуля 16 адрес
Для записи этого числа в орс сервер 15 адрес
Вы про это????
с виндоус все ок
однако raspbian вываливается с ошибкой конфигурирования RS485
ValueError: Failed to set RS485 mode: [Errno 25] Inappropriate ioctl for device
Расскажите пожалуйста по подробнее что изменить!
com_num: PORTS:=0; (*0 - RS-485, 1 - RS-232*)
я руководствовался описанием библиотеки. если вы про это!
Программа для связи ПЛК73 с модулем ввода МВ110 8АС этим связана.
Предположим что это так и есть, следующая наводка, зачем переворачивать четыре байта, если читаете один регистр
Предположим что это так и есть, следующая наводка, зачем переворачивать четыре байта, если читаете один регистр
Quantity:=2, это имеете в виду! было 1 нужно 2 да!
я пробывал и так и так ничего не получается(((((((
Quantity:=2, это имеете в виду! было 1 нужно 2 да!
я пробывал и так и так ничего не получается(((((((
перечитайте еще раз документацию, раз Вы читаете 261 регистр в нем хранится двухбайтное число, чуть ниже в таблице есть и в формате реал значения кaнaлов, кажется начиная с 0х120 регистра. Поэтому определитесь, если хотите по переворачивать, выберите подходящий регистр и измените запрос на чтение двух регистров, если всеже интересует целочисленное то не нужно переворачивать а указатель делать на INT.
третья наводка, что бы что то записать, нужно подготовить вначале данные потом отправить запрос, а копирование одного кейса в другой и замена экземпляра функции и адреса слейва не поможет, правильно изучите пример
Предположим что это так и есть, следующая наводка, зачем переворачивать четыре байта, если читаете один регистр
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Вот порт открывается один раз за 10 стартов программы или реже это что может быть! ?
Подскажите чип USB 485 с гарантированной работой под линукс?
Подскажите чип USB 485 с гарантированной работой под линукс?
овеновский AC4 меня в линуксе ни когда не подводил, там вроде ftdi стоит, хотя читал что ас-4 модернизацию прошел
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Вот порт открывается один раз за 10 стартов программы или реже это что может быть! ?
порт надо открывать один раз, в этом коде ни чго нет про переподключение
Цена великовата. Попробую китайца на ftdi
оставлю инфу по чипу CP210х, вдруг кому поможет.
1) виндоус: Аппаратная инициализация порта через serial.Serial(...), затем serial.rs485_mode=serial.rs485.RS485Settings()
2) мак os+ debian инициалиция через serial.rs485.RS485(...) + serial.rs485_mode=serial.rs485.RS485Settings(delay _before_rx=0.002)
поддерживаю тему далее
смотрим в драйвер:
https://github.com/raspberrypi/linux/blob/rpi-4.9.y/drivers/usb/serial/cp210x.c
{ USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */
То бишь AC4 на этом же чипе.
ошибка сидит в распбиане. установленная убунту работает с этим адаптером
по мере работы возник вопрос: между измерениями 0.3с по конфигуратору, а по результатам чтения - отметка времени меняется раз в 5 секунд. Это правильно?
Если бы был 8АС то не правильно, а так в документации об этом пишется
Если бы был 8АС то не правильно, а так в документации об этом пишется
не более 0.9c на вход для ТСП. То есть установка между измерениями ни на что не влияет? Мне нужно читать 6 входов = 0,9х6=4,8с для модуля для подготовки данных?
подскажите еще, если сталкивались:
поскольку в аппаратном режиме pyserial так и не взлетает, мне нужно организовать обработку owen exception так, чтобы восстанавливать связь с модулем при ошибке типа "данные не получены". Есть ли примеры кода? По аппаратной инициализации RS485 ну просто тишина по линуксу, даже силиконлабс на форуме 2 подобные темы без ответов по существу
не более 0.9c на вход для ТСП. То есть установка между измерениями ни на что не влияет? Мне нужно читать 6 входов = 0,9х6=4,8с для модуля для подготовки данных?
лучше так попробовать и предыдущий пункт руководства тоже надо учитывать
подскажите еще, если сталкивались:
поскольку в аппаратном режиме pyserial так и не взлетает, мне нужно организовать обработку owen exception так, чтобы восстанавливать связь с модулем при ошибке типа "данные не получены". Есть ли примеры кода? По аппаратной инициализации RS485 ну просто тишина по линуксу, даже силиконлабс на форуме 2 подобные темы без ответов по существу
под рутом делаете, ком порты обычно игнорят простых полбзователей, а так не сталкивался, я обмен на Яве делал
root не причем, все порты для dialout и root одинаковы. если пользователя в dialout не добавить, то он и в софтовой инициализации вываливается с пермишинами. Этот вариант я проработал с начала
лучше так попробовать и предыдущий пункт руководства тоже надо учитывать
ну как я выше сказал, что модуль в принципе игнорит эту настройку на свое усмотрение
Slab дал ответ по своему чипу и линукс - управление GPIO не поддерживается. ссылка на тестовый драйвер ведет к 3.х и 2.6.х версиям ядер, у меня все 4+
у меня на RPi без проблем работают на чипах ftdi и на CH340, и cp210x и на PL2303 должно быть без особых отличий.
Есть все, правда последние с TTL, лень проверять с преобразователем TTL-485 (и такой есть)...
Чего у вас там не взлетает не понимаю, можете сделать симлинк и обозвать его COM1 и работайте.
Порты в линукс должны быть уже сконфигурированы по умолчанию с какой-то скоростью, битностью и т.д., необходимо просто изменить настройки работы порта. Может тут затык ?
з.ы. не работал в питоне, нет необходимости.
Чего у вас там не взлетает не понимаю, можете сделать симлинк и обозвать его COM1 и работайте.
мне кажется, что проблема и действия описаны достаточно четко. если не хватает информации, могу привести код пайтона модбас в 10 строк для проверки с вашей стороны
причем тут симлинк если название порта вообще не представляет проблемы и даже не звучало?
Может тут затык ?
з.ы. не работал в питоне, нет необходимости
а вы не по диагонали прочтите тему.
Использую Scada систему, которая работает под Windows и в Mono на Raspberry, ни разу не было с портами проблем при использовании встроенного Modbus драйвера.
Так что скорее всего вы просто что-то делаете неправильно в программе. Есть исходные коды на С#, в том числе и по работе с портами. Modbus тут все же прокладка, протокол может быть любым и непосредственно к поведению порта и его работе он не относится , хоть на Raspberry хоть на Ubuntu хоть на Windows.
Так что ищите проблемы в своем коде питона.
import minimalmodbus
import serial
import serial.rs485
instrument = minimalmodbus.Instrument('COM5',slaveaddress=16) # port name, slave address (in decimal)
instrument.mode = 'rtu' # rtu or ascii mode
instrument.serial.baudrate = 115200 # Baud
instrument.serial.rs485_mode = serial.rs485.RS485Settings()
temperature = instrument.read_register(1, functioncode=3, signed=True, numberOfDecimals=1) # Registernumber, number of decimals
print ('t= ', temperature)
что тут искать? этот код сразу работает на винде и не работает в линуксе (с поправкой на имя порта естессно)
вот на форуме разработчика говорят, что CP2102 не конфигурируется в eeprom в 485, но я все равно не понимаю почему под виндой все ок
PS: настройки битов и четности опущены, тк они по дефолту совпадают с установленными в minimalmodbus
код сразу работает на винде и не работает в линуксе (с поправкой на имя порта естессно)
поправку тоже бы немешало показать, чтоб вопросов не возникало в различии кода и добавте в код instrument.debug = True чтоб искать проблему
В отладчике нет интересного, я его смотрел. Ошибка ioctl сразу вываливается как я уже писал, чтобы код начал хотя бы слать, приходится класс instrument переопределять в части порта, а это уже как сказка про белого бычка. Биты проверяются совсем просто: print instrument. Slabs тоже ничего внятного про эту железку не пишет. Все эти круги по нескольку раз обошёл.
переопределять это как, не совсем понимаю, еще раз ему задавать порт или что
Нет. Это serial.Serial() внутри класса менять на serial.rs485.RS485()
https://github.com/pyhys/minimalmodbus/blob/master/minimalmodbus.py
было
class Instrument():
def __init__(self, port, slaveaddress, mode=MODE_RTU):
if port not in _SERIALPORTS or not _SERIALPORTS[port]:
self.serial = _SERIALPORTS[port] = serial.Serial(port=port, baudrate=BAUDRATE, parity=PARITY, bytesize=BYTESIZE, stopbits=STOPBITS, timeout=TIMEOUT)
else:
self.serial = _SERIALPORTS[port]
if self.serial.port is None:
self.serial.open()
стало
import serial.rs485
class Instrument():
def __init__(self, port, slaveaddress, mode=MODE_RTU):
if port not in _SERIALPORTS or not _SERIALPORTS[port]:
self.serial = _SERIALPORTS[port] = serial.rs485.RS485(port=port, baudrate=BAUDRATE, parity=PARITY, bytesize=BYTESIZE, stopbits=STOPBITS, timeout=TIMEOUT)
else:
self.serial = _SERIALPORTS[port]
if self.serial.port is None:
self.serial.open()
а зачем так то, на сайте в примерах показано как это делать и извне
Я знаю, просто для теста сделал с копией библиотеки
вы работаете с преобразователем usb - rs485 ? зачем лезете менять в библиотеке на 485 ? с ним работают в линукс как с обычным COM портом....
вы работаете с преобразователем usb - rs485 ? зачем лезете менять в библиотеке на 485 ? с ним работают в линукс как с обычным COM портом....
вот с этого момента у меня и начались изыскания - прозрачно не заработало, пришлось искать причину. Я сначала тоже думал, что писать как в обычный порт. Получил таймаут. Потом методом тыка опустил setRTS в ноль после чтения и получил ответ.
Странно, для всех этих преобразователей в ядре есть драйвера и загружаются при помощи udev когда обнаруживается устройство.
Скажите какой именно у вас преобразователь ? cp2102 ? поищу такой и постараюсь проверить на ПР200 на следующей неделе.
Собственно сами можете проверить скачав socat и настроив TCP сервер для ком порта и опросить что нибудь удаленно.
Вполне возможно в коде питона и нет управления портом, как в других, типа socat, remserial и так далее.
2102, все верно. Я честно не понимаю, каких конкретно настроек не хватает. В виндовых модбас мастерах для работы адаптера параметр RTS нужно было отметить, чтобы заработало, а овеновский конфигуратор даже ничего не запросил, сам разобрался
2102, все верно. Я честно не понимаю, каких конкретно настроек не хватает. В виндовых модбас мастерах для работы адаптера параметр RTS нужно было отметить, чтобы заработало, а овеновский конфигуратор даже ничего не запросил, сам разобрался
Он по ascii работает, вот и не просит ни чего. Кстати присоединюсь к вопросу, а почему питон, а не другие языки, визуализацию на нем вроде не построишь
у меня уже написано графическое приложение приложение в питоне под 17 дюймов тач интерфейс, с логами, графопостроителями, удаленным доступом по VNC к машине
плату делал сам - 6 АЦП по spi через мультиплексор по микрочиповскому аппноуту для Pt100 + 2 аппаратных ШИМ канала+4 линии GPIO на прочие дела
все шикарно работало, пока небольшое ЧП не пожгло выходные каналы. Решил не чинить, а поставить связку овеновских модулей ввода вывода. Откопал старый адаптер 7 летней давности, которым когда-то настраивал ТРМ251 и начал внедрять в код модбас или овен (не вижу для себя пока разницы).
Он по ascii работает, вот и не просит ни чего
minimalmodbus тоже это умеет, но это не помогает в достижении результата)
https://github.com/pyhys/minimalmodbus/blob/master/docs/serialcommunication.rst называет адаптер, который работает. Все-таки я склоняюсь, что cp2102 не для линукс или плата аппаратно кривая
minimalmodbus.Instrument<id=0x7697e850, address=16, mode=ascii, close_port_after_each_call=0, precalculate_read_size=True, debug=True, serial=Serial<id=0x76982350, open=True>(port='/dev/ttyUSB0', baudrate=57600, bytesize=8, parity='N', stopbits=1, timeout=0.05, xonxoff=False, rtscts=False, dsrdtr=False)>
0
MinimalModbus debug mode. Writing to instrument (expecting 15 bytes back): ':100300010001EB\r\n' (3A 31 30 30 33 30 30 30 31 30 30 30 31 45 42 0D 0A)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1497469293988.4 ms, minimum silent period: 0.67 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 50.4 ms. Timeout setting: 50.0 ms.
0
('t= ', 0)
Process finished with exit code 0
вообщем с ftdi заработало прозрачно, но код нужно сильно разбавлять ловлей Exception для исключения ошибок
на распбиане толком не пашет. какие-то проблемы с таймингами
это не преобразователи плохие, это проблемы скорее всего библиотек или кода питона.
У меня scada в Mono пашет через любые преобразователи без проблем на Raspbian, а вот в IOT как раз не хватает дров для преобразователей и только как раз CP2102 заработал у товарища...
Попробуйте разобраться с udev, например запретить ему подхватывать устройство, возможно тут причина всех бед. Либо поискать, как при его помощи выставить нужные вам параметры порта, когда udev срабатывает....
библиотеку питона я смотрел, криминала в ней нет. под убунтой кол-во ошибок в разы меньше, чем под распбианом
с udev что делать?
разбираться, смотреть как и что он делает при загрузке модуля драйвера
Для начала поискать инфу, можно ли при помощи udev изменить настройки порта по умолчанию как делает команда
stty 9600 cs8 -parenb -cstopb -F /dev/ttyS0
Если можно, то прописать нужное и при подключении железки оно подхватится.
Еще как вариант не хватает прав на устройство, это вот точно можно при помощи udev сделать.
https://blablacode.ru/linux/522
Ну а сами настройки запихнуть как-то в скрипт
http://www.opennet.ru/tips/info/757.shtml
с правами точно ок.
просто через несколько операций устройство не отвечает, отлавливаю исключение и закрыть/окрыть порт.
утром в 8-20 поставил счетчик ошибок на операцию чтения раз в 1с 6 датчиков. Показывает в 19-15 308 раз таких закрыть/открыть
это все может и проканало бы на 1м устройстве на порту, но если их 2 и более, то алгоритм управления и отслеживания дюже усложняется
потестил модбас с настройкой
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL = True
на 2000 чтения нет ошибок
с овен протоколом так не получается. возможно стоит немного дописать класс порта открытием/закрытием.
в процессе…
еще интересное наблюдение: pycharm с удаленной отладкой на убунту прекрасно выдавал подсказки по методам, на распбиане ни в какую
потому что raspbian не убунту, может надо какие-то пакеты доставить, чтобы и там подсказки были.
нет, при настройке удаленного доступа, он сам тянет интерпретатор с пакетами с удаленного хоста. Единственное отличие я нашел - это версия питона разная
Добавил в овен закрытие порта. За 8 часов и 30000 чтений кол-во ошибок упало до 4
Ну правильно, вы тянете с удаленного хоста (на котором все крутится) а там может не хватать какого-то пакета.
Можно проверить что из пакетов установлено там и там.
не заметил каких-то отличий. Вообще бубунта мне понравилась больше, чем сильно порезанный распбиан. 100Мб памяти не великая плата за удобство
minimalmodbus на 150 000 чтений 0 ошибок
перебирая убунту и прочее всегда возвращался к чистому дебиану - меньше глюков, сколько бы раз не пробовал.
Ну и хорошо, что победили... как говорится...
вчера решил планово на распбиане модули питоновские обновить - 3 часа заняло с доустановкой -dev пакетов, совсем не компилились обновления. Уж как-то сильно нож поработал.
дебиана вроде как не предлагают на малину, хотя особо не вникал
raspbian по сути и есть дебиан для arm процессора, там только есть добавки для работы с 1wire, i2c, gpio ну и настроечные и конфигурационные вещи.
Основа собственно дебиан.
попутно выяснил, что по модбасу и овену показания могут разниться на 0.1°C
Проверка сделана на резисторах вместо ПТ100 в рамках одной временной метки
Чтобы не плодить темы.
Едет ко мне МУ110-8К
Если с чтением все понятно, то с параметром r.ОЕ и библиотекой для Python не очень. Не затруднит привести пример? можно на Си
Здравствуйте. Есть ПЛК110.60 и модуль 8АС. Связываю их по протоколу ОВЕН, значения измеренные идут, всё хорошо. Вопрос в том, как прочитать параметры SRD по протоколу ОВЕН? Для связи использую только конфигурацию кодесиса, никаких библиотек "овенлиб" не ставил.
В РЭ для Модбаса есть адрес регистра. А для протокола ОВЕН есть только hash.
Мне надо по ОВНУ считать статус SRD каждого из каналов. Если адрес модуля 16, то адреса измеренных значений каналов будут для первого 16, для второго 17, и так далее до 8-го канала. Кроме адреса каждого канала в конфигурации у кажого канала есть ещё графа Hash Name, и у измеренных значений каналов написано там read. Каким образом мне считать SRD этого измеренного канала, адрес которого 16? Создаю ещё одну переменную с таким же адресом 16 и в Hash Name пишу ему SRD. В итоге даже измеренное значение перестаёт приходить с модуля. Я так понимаю из-за того, что в конфигурации появляется 2 переменных с одинаковым адресом. А как быть тогда?
Я понимаю что эта тема про Модбас, но другой подходящей темы не нашёл. Потому прошу не тыкать меня в это носом, а помочь. Спасибо.
В РЭ для Модбаса есть адрес регистра. А для протокола ОВЕН есть только hash.
Мне надо по ОВНУ считать статус SRD каждого из каналов. Если адрес модуля 16, то адреса измеренных значений каналов будут для первого 16, для второго 17, и так далее до 8-го канала.
Вы какой тип переменной создаёте? Должен быть Unsigned variable (Listen)
В поле addres пишите адрес канала 16 17...23
В поле Hash name пишите SRD
И вроде как если результат измерения некорректный то возвращается ошибка в канале Read тоже (не проверял)
Вы какой тип переменной создаёте? Должен быть Unsigned variable (Listen)
В поле addres пишите адрес канала 16 17...23
В поле Hash name пишите SRD
И вроде как если результат измерения некорректный то возвращается ошибка в канале Read тоже (не проверял)
Спасибо, вроде заработало. Не тот тип переменной был указан.
Насчёт дублирования кода ошибки в канале Read - всё равно для этого нужно отдельную однобайтную переменную создавать. И при резком обрыве датчика в ней остаётся не код ошибки, а часть битовой маски последнего измеренного зависшего значения. Может я что-то не так опять делаю, но, думаю, лучше уж использовать в программе результат чтения регистра SRD для этой цели.
Так вы обрежьте лишние биты и проверяйте на 0 - нет ошибок или код ошибки и что там. Можете даже соответствующий FBD применять от Овен для этого или самописный petera выкладывал.
уж использовать в программе результат чтения регистра SRD для этой цели.
В примерном проекте с одним модулем работало с 2-мя сигналами хорошо. На 4-х модулях в реальном проекте - не дышит. Вообще никак не реагирует на обрывы, всегда 0 во всех регистрах SRD. И грузит интерфейс так, что измеренные значения с модулей 8АС обновляются с задержкой около 7 секунд. Поставил опрос регистрам SRD 5000 мсек (всё равно ничего не работает, незачем опрашивать), а измеренным - опрос 50 мсек, - стали измеренные нормально обновляться. Мда. Много возможностей дают эти модули, только работать не хотят. Так же не должно быть, чтобы 32 лишних однобайтных значения настолько вешали интерфейс...
Так вы обрежьте лишние биты и проверяйте на 0 - нет ошибок или код ошибки и что там. Можете даже соответствующий FBD применять от Овен для этого или самописный petera выкладывал.
Это блок DECODE_FLOAT имеется в виду?
На блок petera тоже бы хотелось взглянуть, дайте ссылку где посмотреть, если Вам не сложно.
Ага. DECODE_FLOAT тоже не работает. Вообще ничего не делает, тупо передаёт переменную со своего входа на свой выход и всё. Никаких кодов нет, и предустановленное значение при обрыве не ставится. Пробовал его в программе с циклом 100мс, и в свободной. Результат один - ничего.
Как так-то? Прочитанная переменная типа REAL по протоколу ОВЕН с модуля 8АС приходит напрямую на DECODE FLOAT. В чём ошибка?
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot