Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 15.07.2011, 16:25   #1
shumsheec
Пользователь
 
Регистрация: 10.02.2009
Сообщений: 33
Репутация: 10
По умолчанию Вопросы по компоненту 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 Кб, 75 просмотров)

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

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

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

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

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

Щаззз! На дату последнего поста взгляни...
ктонебуть - это кто ?
digitalis на форуме   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


14:07.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru