Страница 23 из 25 ПерваяПервая ... 132122232425 ПоследняяПоследняя
Показано с 221 по 230 из 248

Тема: драйвер Delphi

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Внесу и свои 5 копеек.
    Когда недавно возникла задача вести небольшой процесс, к нему же немного визуализации на ПЦ и заодно архивировать эти данные с возможностью удаленно просмотреть, то оказалось что трейсмод с нужными либами + лектус обходится в сумму не менее 30 килорублей. Что-то мне подсказало что это как-то немного жирновато будет.
    В результате быстро набросал черновой проект на акцессе: mscom32.ocx + немного кода для модбас аски...
    Сразу предвидя крики о стоимости лицензии на акцесс, хочу этих кричащих обломать: клиенту можно и не покупать акцесс - достаточно поставить бесплатный рантайм. Т.е. трейс с опц идет лесом, а мощности акцесса хватит для натягивания трейса в любой конфигурации с ценником за сотню килорублей. Ну и разобраться в акцессе можно быстрее чем в том же дельфи, и это еще не говоря про разные трейсы с мастескадами с их человеконенавистническим интерфейсом, в которые без бутылки лучше не соваться...
    В планах накатать свою ocx/dll для полной подержки modbus serial ascii/rtu на сях (или можно на том же дельфи). Потом может и до TCP доберусь, если это конечно кому-то интересно.
    Только вот свободное время будет где-то в мае...

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    зачем что то изобретать, нужно пользоваться опытом других http://alexsentcha.wordpress.com/sai...ation-library/
    Последний раз редактировалось capzap; 27.02.2012 в 22:52.

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    зачем что то изобретать, нужно пользоваться опытом других http://alexsentcha.wordpress.com/sai...ation-library/
    Да дельфи для работы с акцессом подходит не очень - работа с памятью и указателями его не очень сильная сторона. Точнее я вообще не помню как он там работает с указателями, т.к. раньше их вообще не было.
    А без прямой работы с памятью будет не намного лучше встроенного vba, на котором даже с отдельными битами работать приходится с разными "калькуляторами разрядов". Поэтому этот черновой вариант и был ascii only, т.к. даже контрольную сумму RTU посчитать проблема. Ну и кроме поддержки собственно модбаса, планировалось сделать несколько функций для работы с разными мелочами.

  4. #4
    Пользователь
    Регистрация
    20.02.2008
    Адрес
    Тверь
    Сообщений
    501

    По умолчанию

    Цитата Сообщение от JIexa21 Посмотреть сообщение
    Да дельфи для работы с акцессом подходит не очень - работа с памятью и указателями его не очень сильная сторона. Точнее я вообще не помню как он там работает с указателями, т.к. раньше их вообще не было.
    В Паскале есть всё, что есть в Си и наоборот. Недостаток Паскаля перед Си состоит в том, что его код более доступен для понимания и любой желающий может находить ошибки и указывать на них. А в программе на Си может разобраться только программист более высоко класса, чем творец программы, то есть проверять её и тыкать носом в ошибки никто не будет.

  5. #5
    Пользователь
    Регистрация
    31.08.2010
    Адрес
    Брест
    Сообщений
    23

    По умолчанию

    Всем привет.

    Полтора года назад начинал писать небольшую скаду и всё успешно работало...
    Однако на днях понадобилось сделать некоторые изменения и наткнулся на острую проблему. При поптыке выполнить программу из Дельфи, вылетает ошибка: http://clip2net.com/s/2T5vE

    Работаю с ОРС без каких либо навесок.

    Единственное что приходит на ум, винда7. Полтора года назад всё это писалось на компе под win-xp, а сейчас это всё установлено под управлением win-7.

    Люди, помогите...

  6. #6

    По умолчанию

    Добрый день! Прошу Вашей помощи.
    Изучив данную ветку
    я используя приведеный пример написал программу для работы с OPC сервером (Контроллер ПЛК-100)

    В процессе разработки программы, сначала были созданы кнопки для отправки данных и для считывания. Они работали на УРА. Можно было запустить программу, и через часа два все работало. Но затем я добавил таймер, для постоянного мониторинга состояния датчиков. И тут начались беды. При запуске программы с таймером минут 5-10 все работает и все. Складывается впечатление что ОРС сервер просто "зависает". Данные с него считываются, но только те, которые были в момент зависания. К примеру в контроллере переменная уже равна двум, а он как принимал единицу, так и принимает. А данные не отправляются, при отправке данных происходит ошибка "неопознанная ошибка"....
    Перезагружаешь компьютер - 5 минут работает и виснет. Побывал увеличивать интервалы таймера (изначально я поставил 100 мс, отображение было идеальноым. Не помогло. Затем я просто отключил таймер, и к моему удивлению и это не помогло, хотя ранее без таймера все работало отлично. Может быть Вы сможете что нибудь подсказать? Очень надеюсь на Вашу помощь!

    Текст программы:
    Скрытый текст:

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, OPCAutomation_TLB, StdCtrls, ExtCtrls;
    type
    TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Timer1: TTimer;
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    end;

    var
    Form1: TForm1;

    NewServer:OPCServer;
    NewGroups:OPCGroups;
    NewGroup:OPCGroup;
    NewItems:OPCItems;

    NewItem1, NewItem2, NewItem3, NewItem4, NewItem5:Variant;
    Val1 : Integer;
    Val2, Val3 : Boolean;

    implementation

    // Подключение к серверу
    procedure TForm1.Button4Click(Sender: TObject);
    begin
    // Шаг 1, подключение
    NewServer:=CoOPCServer.Create;
    NewServer.Connect('CoDeSys.OPC.02',NewServer.Serve rNode);

    Memo1.Clear;
    Memo1.Lines.Add(NewServer.ServerName);
    Memo1.Lines.Add(DateTimetostr(NewServer.LastUpdate Time));
    Memo1.Lines.Add(NewServer.VendorInfo+'. Версия '+Inttostr(NewServer.MajorVersion)+'.'+Inttostr(Ne wServer.MinorVersion)+'.'+Inttostr(NewServer.Build Number));
    Memo1.Lines.Add('Состояние сервера='+Inttostr(NewServer.ServerState));

    // Шаг 2, создание группы
    NewGroups:=NewServer.OPCGroups;
    NewGroup:=NewGroups.Add('Group1');

    Memo1.Lines.Add(NewGroup.Name);

    // Добавим Items для обмена данных
    NewItem1:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.tx', 1);
    NewItem2:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz1', 1); // Левый датчик
    NewItem3:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz2', 1); // Правый датчик
    NewItem4:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.sec3', 1); // Левый датчик
    NewItem5:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.sec1', 1); // Правый датчик
    end;

    // Отключение
    procedure TForm1.Button5Click(Sender: TObject);
    begin
    NewServer.OPCGroups.RemoveAll;
    NewServer.Disconnect;
    Memo1.Lines.Add('Состояние сервера='+Inttostr(NewServer.ServerState));
    end;

    // Установить 1-ый режим
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    NewGroup.OPCItems.Item('PLC1:PLC_PRG.tx').Write(1) ;

    Memo1.Lines.Add('Установлен 1-ый режим!');
    end;

    // Установить 2-ой режим
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    NewGroup.OPCItems.Item('PLC1:PLC_PRG.tx').Write(2) ;

    Memo1.Lines.Add('Установлен 2-ой режим!');
    end;

    // Чтение режима
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    NewItem1.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.tx'), Val1);

    Memo1.Lines.Add('Установлен режим №'+VarToStr(NewItem1.Value));
    end;

    // Программа таймера, обновляет показания датчиков
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    NewItem2:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz1', 1); // Левый
    NewItem2.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.poz1'), Val2);

    NewItem3:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz2', 1); // Правый
    NewItem3.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.poz2'), Val3);

    if NewItem2.Value then panel1.Color:=clred else panel1.Color:=clgreen ;
    if NewItem3.Value then panel2.Color:=clred else panel2.Color:=clgreen ;
    end;

    end.

  7. #7

    По умолчанию

    Цитата Сообщение от test_91 Посмотреть сообщение
    // Программа таймера, обновляет показания датчиков
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    NewItem2:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz1', 1); // Левый
    NewItem2.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.poz1'), Val2);

    NewItem3:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz2', 1); // Правый
    NewItem3.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.poz2'), Val3);

    if NewItem2.Value then panel1.Color:=clred else panel1.Color:=clgreen ;
    if NewItem3.Value then panel2.Color:=clred else panel2.Color:=clgreen ;
    end;

    end.
    Может сам OPC глючит, тут после лектуса и кодесиссовского OPC можно всякого ожидать. Крайне они специфичны. Хотя после выбора правильной версии и настройки вроде пашут (зато цена у них не такая как у того же kepware). Для тестов я обычно использую какой-нибудь проверенный клиент, например, kepware. Есть и другие.

    Глянул код. Вот мне странно, а почему ты в таймере каждый раз теги добавляешь
    NewItem2:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz1', 1);
    как думаешь когда OPC от этого станет нехорошо и когда у системы закончатся ресурсы? Конечно за 5 минут вроде не должны бы, хотя как знать. В общем из таймера добавление тегов лучше убрать. Только конечно, если это не какая-то особенность вот данных библиотек. Далее в Delphi таймеры очень специфичны и код в них лучше защищать на случай вылета exception внутри метода и повторного входа в обработчик из-за всплывшего модального окна.
    Потом хорошо еще предусмотреть вариант того что OPC сервер вот взял и упал. Причем очень тихо. И вот тогда надо к нему переконнектится. В общем случае должны быть процедуры для коннекта к OPC с созданием групп и тегов, далее процедура для обновления данных, процедура для проверки доступности сервера, процедура для дисконнекта.

  8. #8

    По умолчанию

    Цитата Сообщение от kfvniiz Посмотреть сообщение
    Может сам OPC глючит, тут после лектуса и кодесиссовского OPC можно всякого ожидать. Крайне они специфичны. Хотя после выбора правильной версии и настройки вроде пашут (зато цена у них не такая как у того же kepware). Для тестов я обычно использую какой-нибудь проверенный клиент, например, kepware. Есть и другие.

    Глянул код. Вот мне странно, а почему ты в таймере каждый раз теги добавляешь
    NewItem2:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz1', 1);
    как думаешь когда OPC от этого станет нехорошо и когда у системы закончатся ресурсы? Конечно за 5 минут вроде не должны бы, хотя как знать. В общем из таймера добавление тегов лучше убрать. Только конечно, если это не какая-то особенность вот данных библиотек. Далее в Delphi таймеры очень специфичны и код в них лучше защищать на случай вылета exception внутри метода и повторного входа в обработчик из-за всплывшего модального окна.
    Потом хорошо еще предусмотреть вариант того что OPC сервер вот взял и упал. Причем очень тихо. И вот тогда надо к нему переконнектится. В общем случае должны быть процедуры для коннекта к OPC с созданием групп и тегов, далее процедура для обновления данных, процедура для проверки доступности сервера, процедура для дисконнекта.
    Изначально этих тегов не было, и программа без них не работала корректно. Когда с датчика приходила единица, то все ок, а вот когда ноль - первый раз считывал нормально, затем вылет - с ошибкой что вышло из допустимого диапазона....

  9. #9
    Пользователь Аватар для Пьер
    Регистрация
    26.01.2011
    Адрес
    Земля
    Сообщений
    519

    Question DELPHI 7 и ПЛК 154 по Modbus RTU

    Дорогие друзья, тему прочитал, просмотрел. Ничего против скады, си и си шарпа не имею. Все хороши, сам работал со SCADAMaster.
    Но моя задача проста:

    Мне нужно через приложеньеце Delphi7 подключиться к ПЛК 154 И.м. по MODBUS RTU (RS-485), т.е. отправлять и получать данные.
    OPC сервер мне не подходит. Приложение должно быть независимое.

    ПК (Master), ПЛК154И.М. (Slave), в дальнейшем хочу последовательно еще контролеров 10 подключить, чтобы с ПК считывать данные и где нужно, управлять.
    Кто нибудь делал такое, можете подсказать что-то по коду?
    читал про ModbusRTU. Вроде все понятно, но камни... В делфи много всяких библиотек. голова кипит от инфы.
    Спасибо!
    Не зная броду, не суйся в воду. (Пословица.)
    Век живи, век учись(а умрешь дураком).
    Опыт растет прямо пропорционально выведенному из строя оборудованию.

  10. #10
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,207

    По умолчанию

    !!! Если ж кто таки разберется - на такого и другой ЯЕБВУ найдется.
    (Язык Еще Более Высокого Уровня)

Страница 23 из 25 ПерваяПервая ... 132122232425 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •