PDA

Просмотр полной версии : Бит окончания передачи по Modbus RTU



Солнечный заяц
31.05.2010, 15:48
Хотелось бы реализовать следующую функцию:
Текущие значения (например температуры) записываются в файл на ПЛК каждые 10 секунд. Каждые 24 часа начинается новый архив, а старый передается по Modbus и удаляется.

Вопрос в следующем:

1. Можно ли как нибудь определить момент, окончания отправки, чтобы сформировать следующую посылку? Кроме как по времени...

2. Где-то на форуме читал что ограничение по количеству полезной информации в одной посылке 128 байт, так ли это?

3. Может быть лучше формировать не файл, а массив, с чем удобней будет работать?

Заранее благодарен.

Ельцов Андрей
01.06.2010, 08:12
Хотелось бы реализовать следующую функцию:
Текущие значения (например температуры) записываются в файл на ПЛК каждые 10 секунд. Каждые 24 часа начинается новый архив, а старый передается по Modbus и удаляется.

Вопрос в следующем:

1. Можно ли как нибудь определить момент, окончания отправки, чтобы сформировать следующую посылку? Кроме как по времени...

2. Где-то на форуме читал что ограничение по количеству полезной информации в одной посылке 128 байт, так ли это?

3. Может быть лучше формировать не файл, а массив, с чем удобней будет работать?

Заранее благодарен.

Здравствуйте.
Как Вы собираетесь передавать архив по modbus?
Если Вы планируете использовать встроенную в ПЛК функцию, то тогда файл автоматически удаляется если произошел запрос последней записи ffff.
Не понятно зачем Вам определять конец посылки...
Полезной информации больше чем 128. максимальный размер пакета данных 255 байт. Из них 5 +/- сервисных.
С массивом такое количество данных передавать не корректно. Лучше файл.

Солнечный заяц
01.06.2010, 09:59
Как Вы собираетесь передавать архив по modbus?
Если Вы планируете использовать встроенную в ПЛК функцию, то тогда файл автоматически удаляется если произошел запрос последней записи ffff.
Не понятно зачем Вам определять конец посылки...

Планировалось использовать модуль "Архиватор" для получения архива, и библиотеку SysLibFile для чтения архива.

Русскоязычного описания для SysLibFile найти не удалось, поэтому пользовался английской версией, там ничего про удаление файла после чтения последнего байта не увидел... Или у Архиватора есть функция передачи файла? :confused:

Передачи планировал производить например по 248 байт (62 float переменые) за одну посылку. Например на GSM/GPRS модем. Но отправка займет какое то время. (И время может быть разным, в случае ошибки в Modbus канале).

Вопрос в том как определить, когда формировать и записывать в регистр вывода следующий кадр с данными.
Что будет если в регистр вывода записать новый массив с данными до окончания отправки предыдущего?

AlexG
01.06.2010, 11:50
По-моему вы занимаетесь дублированием стандартной функции чтения архивов по Modbus используя функцию 20 протокола. Единственный плюс - экономия трафика.

Ельцов Андрей
01.06.2010, 13:53
Немного теории.
У нас в ПЛК поддержана функция чтения архивов по 20-й функции modbus.
Причем есть даже программа, которая умеет читать эти архивы и преобразовывать в приемлемый вид (Lectus OPC).
Вытащить из программы архивы можно с помощью ОРС HDA клиента или из внутренней базы данных SQL-запросом.

Филоненко Владислав
01.06.2010, 14:40
программа для чтения файлов из плк через 20-ю функцию. если кому нужны исходники - могу выслать.
файл сохраняется на диске.

Солнечный заяц
01.06.2010, 15:02
Значит получается ограничение файла для передачи 10 000 регистров = 20 000 байт, верно?
Возможно ли реализовать запрос по 20-ой функции через Конфигуратор ПЛК или только через библиотеку SysLibCom?
Возможно ли совместное использование SysLibCom и Конфигуратор ПЛК по одному порту? Не будет конфликтов?

Солнечный заяц
02.06.2010, 09:23
Точнее не 20-ю функцию а 21-ю (Write File Record)! Т.к. хотелось бы чтобы инициатором связи был именно ПЛК. 21-я функция поддерживается? Если да, то как ее реализовать?

Ельцов Андрей
02.06.2010, 09:58
21-я функция не поддерживается.
Что касается количества записей 10000, то в настройках модуля file (modbus slave) есть параметр отвечающий за количество байт в одной записи.

Солнечный заяц
02.06.2010, 11:13
Что касается количества записей 10000, то в настройках модуля file (modbus slave) есть параметр отвечающий за количество байт в одной записи.
Параметр "Amount byte"? Но там максимум 16 байт :eek: Не понятно зачем нужен такой файл... Или я что-то не так понимаю...
Ведь модуль Архиватотр позволяет делать намного большие файлы.

21-я функция не поддерживается.
Как тогда мне лучше передавать файл, при условии что ПЛК Мастер? Делать безопасные промежутки времени между посылками?



Функция SysComWrite (тип DWORD) передает блок байтов, указанной длины в циклический буфер передатчика требуемого порта, требуемый порт в случае успеха возвращает кол-во байтов, помещенных в циклический буфер передатчика.
Какого размера циклический буфер передатчика? Есть ли опасность его переполнения?

Филоненко Владислав
02.06.2010, 15:48
максимальный размер архива 32кбайта

Солнечный заяц
03.06.2010, 15:53
Функция SysComWrite (тип DWORD) передает блок байтов, указанной длины в циклический буфер передатчика требуемого порта, требуемый порт в случае успеха возвращает кол-во байтов, помещенных в циклический буфер передатчика.
Кажется разобрался: функция SysComWrite передает в буфер передатчика уже сформированный заранее запрос (сырые данные) с адресом прибора, контрольной суммой и т.д., а не формирует запрос сама, как я подумал сначала.
Т.е. мы сами формируем запрос и отправляем в канал связи через SysComWrite, а дальше считаем время и слушаем ответ Слэйва через SysComRead.
Так что размер буфера передатчика для нас не важен.

Огромное Спасибо Александру Вячеславовичу Приходько, за подробное описание библиотеки SysLibCom и примеры (http://www.owen.ru/forum/showpost.php?p=41631&postcount=58)!