SysComRead(ComHandle, ADR(rBuf), SIZEOF(rBuf), 0) не пробовали нолик заменить на другое значение и всетаки приемный буфер читать не прерывно, через операцию WHILE
SysComRead(ComHandle, ADR(rBuf), SIZEOF(rBuf), 0) не пробовали нолик заменить на другое значение и всетаки приемный буфер читать не прерывно, через операцию WHILE
capzap, если честно, смотрел примеры?
Все это пробовал... Я этим 2 дня сидел, уже много чего попробовал
Интересная техподдержка у Овена. Попробуй то, попробуй сё.
Я примеры прислал, а никто их так не посмотрел толком.
Ладно, если завтра ответа не будет, то будем искать что-то другое.
Проблему с чтением ответа по частям конечно можно обойти, но очень уж не хочется ставить на объект глючный контроллер. Мало-ли что еще вылезет.
Все спасибо за участие
Код. Раз не работает.глючный контроллер.
Замороченный, особенно с таймерами. Вы хотите чтоб с этим разбирались ?
Ладно Вам дуться, я по десять раз проверяю проект, а трехгодовалый ребенок подходит и набирает комбинацию клавиш и выскакивает какой нибудь глюк, несуществует в природе понятия все проверил, всегда можно что то упустить
Что именно, не работает:
1. открытие порта
2. настройка порта
3. отправка запроса
4. чтение ответа
что?
Функции для работы с таймером специально написал, что не засорять код, а привлечь внимание к главной проблеме.
И да, я хочу чтобы Вы разбирались. Мне же пришлось с этим разбираться. У меня были готовые "либы" для работы с определенными устройствами на ПЛК100. Тот же самый код очень глючит на ПЛК63.
Я же не просто написал, что "у меня программа глючит, и теряет где-то байты". Я не поленился и написал примеры, где эту проблему можно обнаружить. И чет мне не вериться, что техподдержка Овена не может найти ПЛК100 и ПЛК63, чтобы этот пример проверить. Понимаю, что влом, но у каждого своя работа.
Кто-нибудь пробовал примеры на "железе"??? Никто ни одного конструктивного вопроса по программе не задал.
Если у Вас есть примеры, где ответ от какого-то устройства читается частями, и все работает, то был очень признателен его получить.
1.У меня все работает
2.Про исходник modbus.lib говорил. Хотя я и её не использую - только syslibcom. Но modbus.lib рабочая - изучайте
3.Я использую групповые запросы везде где это возможно в принципе
4.Делая 63-ого мастером, и опрашивая, например МВА8 - размер ответа 101 байт. СП270 читал/писал блоками по 50..100 байт. ПЛК110-60 слейв - чисто попробывал - 248 байт (Почему-то 250 не шмог)
5.Я до сих пор не понимаю акцента на слове "частями"
Всё что в п.4 я никогда и не пытался сделать в одном цикле. Зачем ?
6.Так работая с таймерами вы только за..ли код и моск
7.Ну накой вам чётность ? Краткое описание Вашего нестандартного протокола ? Там нет похожего на контрольную сумму ?
8.Не забывайте что ПЛК100 слейв отвечает в рамках modbus(RTU)
И ровно в этих рамках надо ловить ответ. См. Википедию
9.У Вас с этого ПЛК modbus.lib работает ?
10. Пример - см. п.2
В Modbus.lib читают одним блоком в
rBuf: ARRAY[0..511] OF BYTE;
....
Size := DWORD_TO_WORD(SysComRead(ComHandle, ADR(rBuf), SIZEOF(rBuf), 0));
Это я у же писал. Что еще изучать по данной теме в modbus.lib я не знаю.
Это ни нестандартный протокол а modbus rtu. Суммы там правильные:
REQUEST : ARRAY [ 1..REQUEST_SIZE ] OF BYTE := 16#10, 16#04, 16#00, 16#00, 16#00, 16#04, 16#F2, 16#88;
16- адрес устройства
04 - код функции
00, 00 - адрес первого регистра
00,04 - кол-во регистров
crc - 88F2
Если под рукой нет программы для подсчета crc,
http://www.lammertbies.nl/comm/info/...lculation.html
а по поводу "частями", пожалуйста почитайте самый первый пост.
Если у Вас есть примеры обмена данными для ( ПЛК63 + SysLibCom ), буду очень признателен их увидеть.
К функциональности modbus.lib никаких вопросов. Но меня он в данном случае не интересует. Для обмена данными этот протокол был выбран только потому, что он есть в PLC Конфигураторе, а протоколе ОВЕН мне разбираться лень........
В разные циклы читают последовательные куски одного блокаВ Modbus.lib читают одним блоком в
Еще раз
Симптомы - при чтении из "порта" кол-ва байт меньше чем находится в буфере.
Например в буфере 10 байт,
SysComRead( port, ADR( dest ), 10, 0 ) -> 10
все хорошо,
SysComRead( port, ADR( dest ), 16, 0 ) -> 10
все хорошо, а
SysComRead( port, ADR( dest1 ), 5, 0 ) -> 5
SysComRead( port, ADR( dest2 ), 5, 0 ) -> 4
причем теряется шестой байт.
я не говорю SysLibCom в ПЛК63 вообще не работает. Я прошу пояснить именно ЭТУ проблему.
Пытаться прочитать весь ответ в одном цикле конечно не стоит, особенно если он несколько сот бай.
Раз уж я взял modbus rtu. Можно так:
resultOfRead : DWORD;
buffer : array [ 0..255 ] of byte;
....
resultOfRead := SysComRead( port, adr( buffer ), sizeof( buffer ), 0 );
" перекладываем из буфера в контейнер ответа"
И это будет работать, потому что из буфера "заберут" все содержимое.
По протоколу ответ не может превышать 256 байт.
А если из буфера порта забрать меньше его содержимого, то происходит ПОТЕРЯ ДАННЫХ.