Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2011, 16:25   #1
shumsheec
Пользователь
 
Регистрация: 10.02.2009
Сообщений: 33
По умолчанию Вопросы по компоненту modbustcp

Здравствуйте!
Нужно из программы на Delphi общаться с ПЛК через modbus TCP. Скачал компонент, установил, настроил связь. Читаю и пишу регистры нормально. Но возникло несколько вопросов:
1. Мне нужно связываться с контроллером раз в 100 мс (хотелось бы раз в 50 даже, но ладно). Если в одной обработке таймера пытаюсь одновременно читать и писать, то всё висит, таймер срабатывает раз в секунду. Не могу понять, это глюк со стороны компа или ПЛК?.. Разнёс чтение и запись на разные обработки, т.е. сначала читаю, в следующее срабатывание таймера пишу и т.д. Но хотелось бы всё сразу.. Не подскажете, как это сделать?
2. Так и не понял, как корректно настроить таймаут. Если в программе пробовать читать/писать регистры ПЛК, а он в это время физически не подключён, то прога наглухо виснет. Там есть разные параметры для таймаута - таймаут чтения, таймаут соединения, просто таймаут. Игрался со всеми, но никаких измнений.
Вот единственное, что нашёл по таймауту в исходниках мастера:
Код:
{*** Wait for data from the PLC ***}
  if (FTimeOut > 0) then
  begin
    dtTimeOut := Now + (FTimeOut / 86400000);
  {$IFDEF DMB_INDY10}
    while (IOHandler.InputBuffer.Size = 0) do
  {$ELSE}
    while (InputBuffer.Size = 0) do
  {$ENDIF}
    begin
   {$IFDEF DMB_INDY10}
      IOHandler.CheckForDataOnSource(FReadTimeout);
   {$ELSE}
      if Socket.Binding.Readable(FReadTimeout) then
        ReadFromStack;
    {$ENDIF}
      if (Now > dtTimeOut) then
      begin
        Result := False;
        Exit;
      end;
    end;
  end;
Немного смущает, что значение таймаута делится на такое большое число, прежде чем прибавляется к текущему значению времени для получения дельты.
Может быть, кто-то работал с этим компонентом, или в общих чертах может сказать, как добиться поставленных целей?
3. Может быть, кто-нибудь пользуется отличным от указанного компонентом? Посмотрел, этот компонент очень похож на TCPClient Indy, вроде как унаследован от него. Не думаю, что там сложно, и за несколько дней точно можно разобраться и написать свою библиотечку. Но может быть, уже есть готовые проверенные наработки?
Спасибо!

upd
Нашёл класс, реализующий ModBusTCP без всего лишнего:
Код:
unit ModbusTCP; 
  
 interface 
 uses 
   SysUtils, 
   Dialogs, 
   Windows, 
   Winsock, Classes; 
  
 type 
   TBufer = array[0..32768] of byte; 
   TModbusBuf = array[0..255] of byte; 
  
   TModbusTcpGate = class 
   private 
     fAnswerBuff: TModbusBuf; 
     FBufer: TBufer; 
     fbytesToReceive: Integer; 
     fbytesToSend: Integer; 
     fCS: TRTLCriticalSection; 
     fSockAddr: TSockAddr; 
     fSockConnected: Boolean; 
     fSocket: TSocket; 
     initialized: boolean; 
     iPort: integer; 
     sIP: string; 
     vWSAData: TWSAData; 
   public 
     constructor Create(ip: string; port: integer = 502); 
     destructor Destroy; override; 
     strict private 
       function Communicate: Boolean; 
   private 
     procedure DeInitLib; 
     function InitLib: boolean; 
     procedure Lock; 
     function SockConnect: Boolean; 
     procedure SockDisconnect; 
     procedure Unlock; 
   public 
     function ReadDiscreteInputs(StartingAddress, NumberOfInputs: Integer): Boolean; 
     function ReadMultiplyCoils(StartingAddress, NumberOfCoils: Integer): Boolean; 
     function ReadMultiplyRegisters(StartingAddress, NumberOfRegisters: Integer): 
       Boolean; 
     function WriteSingleCoil(Coil: Integer; NewValue: Boolean = true): Boolean; 
     function WriteSingleRegister(RegisterNumber, NewValue: Integer): Boolean; 
     property Buffer: TModbusBuf read fAnswerBuff write fAnswerBuff; 
   end; 
  
 var 
   ModbusGateway: TModbusTcpGate = nil; 
  
 implementation 
  
 { TModbusTcpGate } 
  
  
 
// целиком код в прикреплённом файле
Но что-то он при вызове ".Create" роняет программу... Скажите пожалуйста, в main нужно добавлять что-то, помимо самого модуля в "uses"?
Вложения
Тип файла: txt modbus.txt (9.0 Кб, 235 просмотров)

Последний раз редактировалось shumsheec; 15.07.2011 в 19:29. Причина: нашёл класс, но он не работает
shumsheec вне форума Ответить с цитированием
Старый 18.07.2011, 17:29   #2
shumsheec
Пользователь
 
Регистрация: 10.02.2009
Сообщений: 33
По умолчанию

Мда, вероятно, мало кому из программистов для ПК требуется связь с железяками... Надо искать в другом месте. Может, подскажете, где?
shumsheec вне форума Ответить с цитированием
Старый 14.10.2011, 15:22   #3
bratcho
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 20
По умолчанию проблема с modbusTCP

shumsheec здравствуйте!
Вы решили задачу связи с ПЛК по ModBusTCP?
У меня сейчас тоже есть проблема с этим компонентом. В версии 1.5 такая же ситуация. Состоит она в том, что больше 125 регистров данный компонент не считывает, а мне надо больше. Я вроде и исходники уже менял (source файлы), нашел где это ограничение задано, переустанавливал компонент, все равно есть проблемы (( Не подскажите решение?
Заранее спасибо!
bratcho вне форума Ответить с цитированием
Старый 26.03.2012, 13:09   #4
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

У меня проблема на два шага позади вас - не получается установить библиотеку delphimodbus. Я немного далёк в этом. Думал будет .dll-ка, и файл .pas с адресами ф-й из этой библиотеки, но там ничего подобного, я не знаю как это установить. Опишите сюда, пожалуйста процедуру установки. Спасибо.
ЗЫ: задача минимум состоит в том, чтоб подключиться по modbusTCP к серверу и оказать хоть каоке-то влиянее на его состояние из программы.
eduard93 вне форума Ответить с цитированием
Старый 29.06.2018, 23:27   #5
vlkc
Новичок
Джуниор
 
Регистрация: 08.04.2010
Сообщений: 2
По умолчанию

А как работать? Может примером ктонебуть поделится?
vlkc вне форума Ответить с цитированием
Старый 30.06.2018, 22:29   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,529
По умолчанию

Щаззз! На дату последнего поста взгляни...
ктонебуть - это кто ?
digitalis вне форума Ответить с цитированием
Старый 25.05.2020, 16:02   #7
newtimka
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 1
По умолчанию

Победили?
newtimka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по компоненту DateTimePicker Dux Компоненты Delphi 5 18.09.2010 23:02
по компоненту Chart Smerch66 Общие вопросы Delphi 2 21.04.2010 08:11
Вопросы по компоненту CoolBar Sunctor Компоненты Delphi 0 09.01.2010 23:04
Вопросы по компоненту syn edit LAGOX Компоненты Delphi 1 10.04.2009 18:14
Вопрос по компоненту MonthCalendar AIst Компоненты Delphi 1 02.04.2009 13:25