На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (6) « Первая ... 2 3 [4] 5 6  все  ( Перейти к последнему сообщению )  
> ModBus
    trainer

    ExpandedWrap disabled
      procedure TForm1.Button7Click(Sender: TObject);
       
      var
       PortId: Integer;
       res: Integer;
       wr_data: array[1..8] of Byte;
       rd_buffer: array[1..8] of Byte;
       
      begin
      PortId := TrComPortOpen(0); (* COM1 *)
      if TRCOM_SUCCEEDED(PortId) then
         // порт открыт - устанавливаем параметры соединения
         TrComPortParameters(tcpmpBaudRate or tcpmpDefaultTimeout or tcpmpByteSize or tcpmpStopBits or tcpmpCheckParity or tcpmpParity or tcpmpEnableRtsControl or tcpmpEnableDtrControl, //[B]на этой строчке выдаёт ошибку((( натолкните плз на мысль...[/B]
                                         CBR_9600,           (* 9600 бод *)
                                         5000,               (* по умолчанию тайм-аут 5 с. *)
                                         8,                  (* 8 бит *)
                                         ONESTOPBIT,         (* 1 стоп-бит *)
                                         0,                  (* без проверки четности *)
                                         NOPARITY,           (* без бита четности *)
                                         RTS_CONTROL_DISABLE,(* изначально RTS-off *)
                                         DTR_CONTROL_ENABLE);(* изначально DTR-on *)
         res := TrComPortSetConfig(PortId,params);
         if TRCOM_SUCCEEDED(res) then
         begin
            (* параметры заданы - устанавливаем управляющие сигналы(DTR-on, RTS-off) *)
            res := TrComPortSetControl(PortId, TRCOM_CTRL(tcpccSet,tcpccClear));
            if TRCOM_SUCCEEDED(result) then
            begin
               (* управляющие согналы установлены - передаем и принимаем данные
                  передаем 6 байт, принимаем 1 байт, тайм-аут - 1 с. *)
               res := TrComPortWriteAndRead(PortId, wr_data, 6, rd_buffer, 1, 1000);
               if TRCOM_SUCCEEDED(result) then
               begin
                  (* что-нибудь делаем далее *)
               end;
            end;
         end;
         (* т.к. порт больше не нужен, закрываем его *)
         result = TrComPortClose(PortId);
      end;
      Не паскалист я. Неправильно там вроде написано.
      Либо
      ExpandedWrap disabled
        const
         params : TrComPortParameters  =
            (DesiredParams: tcpmpBaudRate or tcpmpDefaultTimeout or tcpmpByteSize or tcpmpStopBits or tcpmpCheckParity or
                                     tcpmpParity or tcpmpEnableRtsControl or tcpmpEnableDtrControl,
             BaudRate: CBR_9600,           (* 9600 бод *)
             DefaultTimeout: 5000,               (* по умолчанию тайм-аут 5 с. *)
             ByteSize: 8,                  (* 8 бит *)
             StopBits: ONESTOPBIT,         (* 1 стоп-бит *)
             CheckParity: 0,                  (* без проверки четности *)
             Parity: NOPARITY,           (* без бита четности *)
             RtsControl: RTS_CONTROL_DISABLE,(* изначально RTS-off *)
             DtrControl: DTR_CONTROL_ENABLE);(* изначально DTR-on *)
         
        var
         PortId: Integer;
         res: Integer;
         wr_data: array[1..8] of Byte;
         rd_buffer: array[1..8] of Byte;
         
        begin
        PortId := TrComPortOpen(0); (* COM1 *)
        if TRCOM_SUCCEEDED(PortId) then
           // порт открыт - устанавливаем параметры соединения
           res := TrComPortSetConfig(PortId,params);
           if TRCOM_SUCCEEDED(res) then
           begin
              (* параметры заданы - устанавливаем управляющие сигналы(DTR-on, RTS-off) *)
              res := TrComPortSetControl(PortId, TRCOM_CTRL(tcpccSet,tcpccClear));
              if TRCOM_SUCCEEDED(result) then
              begin
                 (* управляющие согналы установлены - передаем и принимаем данные
                    передаем 6 байт, принимаем 1 байт, тайм-аут - 1 с. *)
                 res := TrComPortWriteAndRead(PortId, wr_data, 6, rd_buffer, 1, 1000);
                 if TRCOM_SUCCEEDED(result) then
                 begin
                    (* что-нибудь делаем далее *)
                 end;
              end;
           end;
           (* т.к. порт больше не нужен, закрываем его *)
           result = TrComPortClose(PortId);
        end;
      либо
      ExpandedWrap disabled
        var
         PortId: Integer;
         res: Integer;
         wr_data: array[1..8] of Byte;
         rd_buffer: array[1..8] of Byte;
         params : TrComPortParameters;
        begin
        PortId := TrComPortOpen(0); (* COM1 *)
        if TRCOM_SUCCEEDED(PortId) then
           // порт открыт - устанавливаем параметры соединения
           with params do begin
             DesiredParams := tcpmpBaudRate or tcpmpDefaultTimeout or tcpmpByteSize or tcpmpStopBits or tcpmpCheckParity or
                                        tcpmpParity or tcpmpEnableRtsControl or tcpmpEnableDtrControl,
             BaudRate := CBR_9600,           (* 9600 бод *)
             DefaultTimeout := 5000,               (* по умолчанию тайм-аут 5 с. *)
             ByteSize := 8,                  (* 8 бит *)
             StopBits := ONESTOPBIT,         (* 1 стоп-бит *)
             CheckParity := 0,                  (* без проверки четности *)
             Parity := NOPARITY,           (* без бита четности *)
             RtsControl := RTS_CONTROL_DISABLE,(* изначально RTS-off *)
             DtrControl := DTR_CONTROL_ENABLE);(* изначально DTR-on *)
           end;
           res := TrComPortSetConfig(PortId,params);
           if TRCOM_SUCCEEDED(res) then
           begin
              (* параметры заданы - устанавливаем управляющие сигналы(DTR-on, RTS-off) *)
              res := TrComPortSetControl(PortId, TRCOM_CTRL(tcpccSet,tcpccClear));
              if TRCOM_SUCCEEDED(result) then
              begin
                 (* управляющие согналы установлены - передаем и принимаем данные
                    передаем 6 байт, принимаем 1 байт, тайм-аут - 1 с. *)
                 res := TrComPortWriteAndRead(PortId, wr_data, 6, rd_buffer, 1, 1000);
                 if TRCOM_SUCCEEDED(result) then
                 begin
                    (* что-нибудь делаем далее *)
                 end;
              end;
           end;
           (* т.к. порт больше не нужен, закрываем его *)
           result = TrComPortClose(PortId);
        end;
      Как-то так.
        trainer.
        Очень прошу помочь.
        Получаю данные с СОМ порта моей терминальной программой (делфи, компонент соmm32) вот в таком виде:

        яяя/00016661<0
        >6==;83<<49;:8
        3><0;1>?4388><
        2:000000003;

        Что нужно мне сделать, может нужна функция или процедура, чтобы конвертировать в
        читабельный формат.

        После обработки должно быть

        Temp=-7.21, PD=0.024, Davl=0.376, Rasx=273.845;
          "Я не волшебник, я только учусь..." (c) не-помню-откуда.
          Бери описание протокола обмена и смотри.
            Trainer, подскажите, если вместо обыкновенного компонента соmm32 я буду использовать modbus компонент, чтонибуть изменит.
              Если ты будешь при чтении использовать очки, поможет это тебе читать китайские тексты?
                Помогите новичку! Использую TrComPort, взял пример из ReadMe.txt. Как я понял он считывает 1 байт и на этом завершает работу. А как считать все данные, поступившие на порт? Я пишу программу для работы со сканером штрих-кодов и мне нужно, чтобы каждый раз, когда сканером читают штрих-код, он целиком попадал в программу, а там дальше с ним велась дальнейшая работа. Подскажите пожалуйста как это сделать.
                  Цитата Ex0RCi$t @
                  А как считать все данные, поступившие на порт?
                  Воспользоваться функцией чтения. Логично?
                    Логично :)
                    Видимо TrComPortReadArray(INT portid, LPVOID buffer, DWORD length, LONG timeout) ?
                    А параметр length у неё должен быть равен тому, что вернёт TrComPortGetQueue()?
                      да.

                      Добавлено
                      Можно просто читать побайтно, пока не появится заданный символ
                        Есть отличная библиотека на C для modbus мастера: www.modbus.org. Может быть скомпилированна под Windows и Linux. Здесь читал её небольшое описание по-русски с примерами: http://robot-develop.org/archives/1042.
                          Цитата dmitry90 @
                          Есть отличная библиотека на C для modbus мастера: www.modbus.org. Может быть скомпилированна под Windows и Linux. Здесь читал её небольшое описание по-русски с примерами: http://robot-develop.org/archives/1042.

                          Помогите, пожалуйста, новичку! Необходимо по протоколу Модбас через ком-порт считывать и записывать данные в приборы ОВЕН. Не могу понять, что нужно делать с этим http://www.libmodbus.org/download/. Если можно по пунктам. Большое спасибо

                          Добавлено
                          Всё это делаю в Borland C++ Builder 6
                            Цитата dmitry90 @
                            Есть отличная библиотека на C для modbus мастера: www.modbus.org. Может быть скомпилированна под Windows и Linux. Здесь читал её небольшое описание по-русски с примерами: http://robot-develop.org/archives/1042.

                            Спасибо за ссылку, посмотрел собрал LIB из библиотеки, подключил к проекту примера, собрал, все нормально. Но при работе не открывается порт. Правда коробочки с ModBus и устройств у меня пока нет, учусь плавать на сухую. Может поэтому проблемы? Вообщк е хотелось бы поюзать готовый рабочий проект с использованием библиотеки. Может вы могли бы дать ссылочку, или код? Работаю под VS 2010, C++.
                              Цитата
                              Но при работе не открывается порт. Правда коробочки с ModBus и устройств у меня пока нет

                              НУ если нет железа то и не откроется порт, так как его нету.
                                Цитата Dem_max @
                                Цитата
                                Но при работе не открывается порт. Правда коробочки с ModBus и устройств у меня пока нет

                                НУ если нет железа то и не откроется порт, так как его нету.

                                Есть проблема с компиляцией библиотеки ModBus. Не находится описание типа ssize_t.
                                Я покопался в MSDN и нашел LONG_PTR. В хедере добавил
                                typedef LONG_PTR ssize_t
                                И все откомпилировалось и запустилось. Вопрос, правильно ли я сделал?
                                Вообще то такого в проверенных библиотеках не должно быть. Может я скачал
                                кривую библиотеку из инета? Если у кого то такого не было, кинте ссылочку на правльные
                                исходники библиотеки. Буду очень признателен.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (6) « Первая ... 2 3 [4] 5 6  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0486 ]   [ 16 queries used ]   [ Generated: 27.04.24, 17:57 GMT ]