pascalScada
Модератор: Модераторы
Попробовал воткнуть вместо WestAsciiDriver ModBusRTUDriver. Действительно, вижу что комп обращается к шине - светодиод заморгал.
Что ж делать-то. Мож разработчику написать.
Что ж делать-то. Мож разработчику написать.
Штирлиц всех обманул - проявил смекалку и вышел через вход.
Мы же связались с разработчиком девайса и он пообещал сделать RTU режим.
Попутно протестировали ModBusRTUDriver на другом девайсе - все работает, читается, записывается...
А на WestASCIIDriver еще заметил такую вещь - как только прописываешь PLCDeviceID=1, система подвисает - проц загружается на 100%. Поначалу на многоядерной машине это было незаметно, но на одноядерной все так грустно становится, что мышь еле двигается.
Мы же связались с разработчиком девайса и он пообещал сделать RTU режим.
Попутно протестировали ModBusRTUDriver на другом девайсе - все работает, читается, записывается...
А на WestASCIIDriver еще заметил такую вещь - как только прописываешь PLCDeviceID=1, система подвисает - проц загружается на 100%. Поначалу на многоядерной машине это было незаметно, но на одноядерной все так грустно становится, что мышь еле двигается.
Вопрос: в программке хочу сделать отдельную страницу с настройками (параметры последовательного порта, адрес модбас-устройства). Как сделать так, чтобы в выпадающем комбобоксе появлялись те же пункты, что и в свойствах SerialPortDriver? Например, список только доступных для использования в системе портов. В идеале вообще перенаправить выпадающие меню свойств SerialPortDriver в выпадающие меню окна настроек программы.
И как лучше хранить настройки?
И как лучше хранить настройки?
Тему пока забросил, некогда. Продолжать разбираться думаю не раньше сентября. Настройки храню в ini - файлах. Будут появляться пункты с которыми разобрался пиши, прочту с удовольствием, чувством благодарности и сэкономленным временем.
Прошу помочь примерами работы с pascalscada в связке с Lazarus. Интересуют функции чтения/записи в ком порт , драйвер modbusRTU. Поделитесь кодами или хэлпами. Заранее благодарен
В ком порт пишет и читает автоматически при создании на форме всех необходимых компонентов и правильной установки их свойств. Минимальный пример разбирается ]тут http://freepascal.ru/article/raznoe/20120522102100.
Спасибо за статью, единственное не разобрался как читать с определенного регистра данные, а если устройств на шине 5 , программно менять свойства PLCTag ?
P.S. простите за наивные вопросы, только начинаю осваиваться в данной сфере
P.S. простите за наивные вопросы, только начинаю осваиваться в данной сфере
Для пяти разных устройств, я содал бы пять PLCTAG. Для чтения используйте функцию модбас, рекомендованую производителем (свойство memReadFunction).
как мне отправлять команды и получать ответ от устройства есть необходимость передавать команды настройки устройства (например передать адрес устройства, функция и адрес памяти как я понял задаюстя в свойствах PLCTAG) как передать адрес?
и как принимать ответ, как я понимаю ответ это массив байт.
и как принимать ответ, как я понимаю ответ это массив байт.
как мне отправлять команды и получать ответ от устройства есть необходимость передавать команды настройки устройства (например передать адрес устройства
Код: Выделить всё
plcTagReadPR110.PLCStation := 1;функция
Код: Выделить всё
plcTagReadPR110.MemReadFunction:=3;адрес памяти
Код: Выделить всё
plcTagReadPR110.MemAddress := $100;и как принимать ответ
Код: Выделить всё
dataPR110:=round(plcTagReadPR110.Value);Может я где то и не прав, но работает.
Благодарю, все работает
еще волнует такой вопрос: при формировании пакета нужно указать количество принимаемых байт данных, какое свойство
После выполнения кода в логе записывается посылка:
В соответсвии со спецификацией по порядку:
код устройства (1 байт) -03
код функции (1 байт) - 03
адрес ячейки (2 байта) - 00 12
количество запраiиваемых байт (2 байта) - 00 01
контрольная сумма (2 байта) - 25 ED
Код: Выделить всё
tagn1.MemReadFunction:=3;
tagn1.MemAddress:=16;
tagn1.PLCStation:=3;
tagn1.read;
s1:='К1 = ' + floattostr(round(tagn1.Valueraw));После выполнения кода в логе записывается посылка:
Written: 03 03 00 12 00 01 25 ED
В соответсвии со спецификацией по порядку:
код устройства (1 байт) -03
код функции (1 байт) - 03
адрес ячейки (2 байта) - 00 12
количество запраiиваемых байт (2 байта) - 00 01
контрольная сумма (2 байта) - 25 ED
нашел ответ сам. кому может пригодится вот решение
вместо PLCTagNumber использовать PLCBlock, у которого в свою очередь имеется свойство size (отвечающее за количество ожидаемых байт)
вместо PLCTagNumber использовать PLCBlock, у которого в свою очередь имеется свойство size (отвечающее за количество ожидаемых байт)
отписывайся подробнее. Как я понял PLCBlock используется совместно с PLCBlockElement? Хотя у меня такой задачи пока нет, но мало ли. Потом пригодится.
элемент tagblock1 класс TPCLBlock должен быть предварительно настроен, аналогично tagnumber, также тип tagblock1 был установлен pttfloat
данный код читает два байта и выводит их в строку(т.е. команда прочитать два байта , начальный адрес 0250);
- позволяет обратиться к i прочитанному байту равноценно коду который имеет свойство index (номер элемента), т.е.
з.ы. хотя это чисто мои доводы, может быть я неправ
Код: Выделить всё
tagblock1.PLCStation:=1; //адрес устройства
tagblock1.MemReadFunction:=3; //функция чтения
tagblock1.TagSizOnProtocol:=2; //размер блока
tagblock1.MemAddress:=0250; //адрес ячейки откуда читать
while timer1.Enabled do //бесконечный цикл пока работает таймер
begin
application.ProcessMessages; //позволяем обрабатывать события приложением
tagblock1.Read; //читаем
s1:='T= '+formatfloat('0.00000',tagblock1.ValueRaw[0]); //---обращаемся к прочитанному блоку данных---
memo1.Text:=s1; //выводим в мемо
end; данный код читает два байта и выводит их в строку(т.е. команда прочитать два байта , начальный адрес 0250);
Код: Выделить всё
tagblock1.ValueRaw[i]Код: Выделить всё
plcblockelement1.ValueКод: Выделить всё
tagblock1.ValueRaw[0]
//равносильно
plcblockelement1.index:=0; plcblockelement1.Valueз.ы. хотя это чисто мои доводы, может быть я неправ
