pascalScada

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Re: pascalScada

Сообщение modbus » 28.06.2012 12:27:45

Попробовал воткнуть вместо WestAsciiDriver ModBusRTUDriver. Действительно, вижу что комп обращается к шине - светодиод заморгал.
Что ж делать-то. Мож разработчику написать.
modbus
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.06.2012 16:58:10

Re: pascalScada

Сообщение modbus » 06.07.2012 11:51:09

Штирлиц всех обманул - проявил смекалку и вышел через вход.
Мы же связались с разработчиком девайса и он пообещал сделать RTU режим.
Попутно протестировали ModBusRTUDriver на другом девайсе - все работает, читается, записывается...
А на WestASCIIDriver еще заметил такую вещь - как только прописываешь PLCDeviceID=1, система подвисает - проц загружается на 100%. Поначалу на многоядерной машине это было незаметно, но на одноядерной все так грустно становится, что мышь еле двигается.
modbus
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.06.2012 16:58:10

Re: pascalScada

Сообщение modbus » 13.07.2012 13:17:01

Вопрос: в программке хочу сделать отдельную страницу с настройками (параметры последовательного порта, адрес модбас-устройства). Как сделать так, чтобы в выпадающем комбобоксе появлялись те же пункты, что и в свойствах SerialPortDriver? Например, список только доступных для использования в системе портов. В идеале вообще перенаправить выпадающие меню свойств SerialPortDriver в выпадающие меню окна настроек программы.
И как лучше хранить настройки?
modbus
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.06.2012 16:58:10

Re: pascalScada

Сообщение serg_iv » 13.07.2012 20:25:00

Тему пока забросил, некогда. Продолжать разбираться думаю не раньше сентября. Настройки храню в ini - файлах. Будут появляться пункты с которыми разобрался пиши, прочту с удовольствием, чувством благодарности и сэкономленным временем.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: pascalScada

Сообщение madlih » 05.10.2012 12:22:23

Прошу помочь примерами работы с pascalscada в связке с Lazarus. Интересуют функции чтения/записи в ком порт , драйвер modbusRTU. Поделитесь кодами или хэлпами. Заранее благодарен
madlih
новенький
 
Сообщения: 13
Зарегистрирован: 05.10.2012 11:57:04

Re: pascalScada

Сообщение serg_iv » 06.10.2012 14:13:06

В ком порт пишет и читает автоматически при создании на форме всех необходимых компонентов и правильной установки их свойств. Минимальный пример разбирается ]тут http://freepascal.ru/article/raznoe/20120522102100.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: pascalScada

Сообщение madlih » 08.10.2012 10:34:18

Спасибо за статью, единственное не разобрался как читать с определенного регистра данные, а если устройств на шине 5 , программно менять свойства PLCTag ?

P.S. простите за наивные вопросы, только начинаю осваиваться в данной сфере
madlih
новенький
 
Сообщения: 13
Зарегистрирован: 05.10.2012 11:57:04

Re: pascalScada

Сообщение serg_iv » 08.10.2012 10:42:11

Для пяти разных устройств, я содал бы пять PLCTAG. Для чтения используйте функцию модбас, рекомендованую производителем (свойство memReadFunction).
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: pascalScada

Сообщение madlih » 09.10.2012 11:15:37

как мне отправлять команды и получать ответ от устройства есть необходимость передавать команды настройки устройства (например передать адрес устройства, функция и адрес памяти как я понял задаюстя в свойствах PLCTAG) как передать адрес?
и как принимать ответ, как я понимаю ответ это массив байт.
madlih
новенький
 
Сообщения: 13
Зарегистрирован: 05.10.2012 11:57:04

Re: pascalScada

Сообщение serg_iv » 09.10.2012 12:28:35

как мне отправлять команды и получать ответ от устройства есть необходимость передавать команды настройки устройства (например передать адрес устройства

Код: Выделить всё
plcTagReadPR110.PLCStation := 1;

функция

Код: Выделить всё
plcTagReadPR110.MemReadFunction:=3;

адрес памяти

Код: Выделить всё
plcTagReadPR110.MemAddress := $100;

и как принимать ответ

Код: Выделить всё
dataPR110:=round(plcTagReadPR110.Value);


Может я где то и не прав, но работает.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: pascalScada

Сообщение madlih » 10.10.2012 13:06:43

Благодарю, все работает
madlih
новенький
 
Сообщения: 13
Зарегистрирован: 05.10.2012 11:57:04

Re: pascalScada

Сообщение madlih » 12.10.2012 08:40:52

еще волнует такой вопрос: при формировании пакета нужно указать количество принимаемых байт данных, какое свойство
Код: Выделить всё
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
madlih
новенький
 
Сообщения: 13
Зарегистрирован: 05.10.2012 11:57:04

Re: pascalScada

Сообщение madlih » 15.10.2012 16:26:13

нашел ответ сам. кому может пригодится вот решение
вместо PLCTagNumber использовать PLCBlock, у которого в свою очередь имеется свойство size (отвечающее за количество ожидаемых байт)
madlih
новенький
 
Сообщения: 13
Зарегистрирован: 05.10.2012 11:57:04

Re: pascalScada

Сообщение serg_iv » 16.10.2012 07:47:21

отписывайся подробнее. Как я понял PLCBlock используется совместно с PLCBlockElement? Хотя у меня такой задачи пока нет, но мало ли. Потом пригодится.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: pascalScada

Сообщение madlih » 16.10.2012 09:26:48

элемент tagblock1 класс TPCLBlock должен быть предварительно настроен, аналогично tagnumber, также тип tagblock1 был установлен pttfloat

Код: Выделить всё

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]
- позволяет обратиться к i прочитанному байту равноценно коду
Код: Выделить всё
plcblockelement1.Value
который имеет свойство index (номер элемента), т.е.
Код: Выделить всё
tagblock1.ValueRaw[0]
//равносильно
plcblockelement1.index:=0; plcblockelement1.Value

з.ы. хотя это чисто мои доводы, может быть я неправ
madlih
новенький
 
Сообщения: 13
Зарегистрирован: 05.10.2012 11:57:04

Пред.След.

Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru