библа, пользовательская программа, нижний уровень работы порта
255, 253, 2 ошибки, как правило. Первая - таймаут, вторая, как тут написали, ошибка КС.
Если закомментирую, у меня счётчик ошибок не будет работать, ошибки не уйдут
библа, пользовательская программа, нижний уровень работы порта
255, 253, 2 ошибки, как правило. Первая - таймаут, вторая, как тут написали, ошибка КС.
Если закомментирую, у меня счётчик ошибок не будет работать, ошибки не уйдут
Ошибки обмена конечно не будет
Мне кажется для оценки максимальной скорости нужно сократить объём обмена до минимума, вплоть до одного регистра, и последовательно увеличивать объём обмена (и/или добавления команд записи) до момента возникновения ошибок.
Не смотрели, какой реальный цикл ПЛК отображается при работе?
часть первая, открытие: запускаете КДС, выбираете открыть или из меню Файл->Открыть или нажать на иконку папки, далее в выпадающем списке Тип файла выбираете библиотека и ищите в какой папке расположена та самая библиотека
часть вторая, свойства: по любому ПОУ жмете ПКМ, в контекстном меню выбираете свойства объекта, в появившемся окошке выбираете полный и ставите галку применить ко всем, после этого все файлы доступны для редактирования
Всем привет!
И, возвращаясь к нашим баранам, настроил работу по MODBUS (RS-485, RTU, 115200) с 9ю драйверами SMSD условно параллельно, при этом операции записи/чтения по MODBUS не прерываются другими потоками.
Вылезает глюк при записи в регистры TARGET_POS ИЛИ ABS (команда write single register), в отладке выглядит так:
Вложение 71532
постоянно заходит в 26 строчку и выдает ошибку EXC_HW
сверху видно что буфер корректный, корректность буфера проверил подключившись моксой к линии RS:
Вложение 71533
Код проекта
Вложение 71534
Подскажите пожалуйста куда копать
Тут как понимаю может сбиваться работа порта ПЛК, или библиотеки Modbus.lib, которую я расшарил, но ничего в ней не менял (пока)
на форуме встречал что меняли очистку данных порта в коде Modbus.lib
Порт можно попробовать закрывать и заново открывать, но закрытия порта не встречал ни у кого в коде, т.е. никто этим не пользуется
а также были проблемы при изменении буфера во время записи по модбасу, но у меня буфер не меняется (или я так считаю), это видно в отладке на скрине выше
Помогло переоткрытие порта.
Интересно что тут на форуме я подобной проблемы ни у кого не встречал.
Ещё сделал как тут:
https://owen.ru/forum/showthread.php...l=1#post219530
а именно поправил 7 строчку
Было бы неплохо если бы представители Овна наконец заметили (т.е. передали бы своим разработчикам) косяк в своей библиотеке, о котором пишут на форуме, когда мусор из порта считывается в рабочий буферКод:WHILE SysComRead(ComHandle, ADR(DataBuf[20]), SIZEOF(DataBuf) - 20, 0) <> 0 DO;
Доброго! Хотелось бы поднять данную тему, потому как +DataSize/-DataSize - если честно, некий странный костыль, который - решает некоторые проблемы, но не все. Идя по логике мыслей capzap - объявляем в константах новый чистый массив (например, BufClean: ARRAY[0..255] OF BYTE := 256(0)) и, при начале нового цикла, перед формированием запроса на отправку в порт - принудительно чистимся (то есть, прошлые данные мы уже вычитали, теперь мы хотим снова спросить у оборудования, как дела). Тогда код должен выглядеть следующим образом:
IF Read = FALSE THEN (* Начало нового цикла обмена *)
DataBuf := BufClean; (* Наша добавленная строка очистки буфера *)
(*Далее начинается сборка пакета на запись нового запроса*)
BrCast := DataBuf[0] = 0;
IF Mode = MB_RTU THEN
CrcReg := MB_CRC(ADR(DataBuf), DataSize);
DataBuf[DataSize] := WORD_TO_BYTE(CrcReg);
DataBuf[DataSize + 1] := WORD_TO_BYTE(SHR(CrcReg, 8));
DataSize := DataSize + SIZEOF(CrcReg);
Read := SysComWrite(ComHandle, ADR(DataBuf), DataSize, 0) = DataSize;
ELSE
...
Такой вопрос - где сломалась логика?.. В данный момент - буфер постоянно пустой..
Если чистку мы не инициируем, то, получается все как всех - видим пришедший от оборудования корректный ожидаемый ответ, но, из-за кучи мусора мы не можем корректно завершить цикл (Complete = TRUE, Exception = 0). Само собой, можно оставить, как есть и забирать результаты из "мусора" же, но тогда мы лишаемся возможности вести статистику опросов(сколько раз за время работы модуль не ответил, прочее), не говоря о том, что разбор происходит вручную..