Страница 108 из 174 ПерваяПервая ... 85898106107108109110118158 ... ПоследняяПоследняя
Показано с 1,071 по 1,080 из 1740

Тема: CODESYS V3.5. Настройка обмена с другими устройствами (Modbus, ОВЕН, OPC и др.)

  1. #1071

    По умолчанию

    ДОбрый день
    Хотел поделиться способом использования библиотеки COM_Control для взаимодействия с устройствами по шине Modbus/
    Я предпочитаю максимально использовать Modbus для разработки проектов и в конце концов я пришел к использованию овеновской библиотеки COM_Control
    Но для такой реализации необходимо точно знать сколько времени уходит на обмен с устройством, были или не были ошибки и как давно были получены данные.
    Для этого я реализовал ФБ ModbusStack и структуру STACK. Стек реализован по принципу FIFO.
    Структура стека такая
    TYPE MODBUS_STACK:
    STRUCT
    usiSlaveID : USINT;
    eFuncCode : OCL.MB_FC;
    uiDataAddr : UINT;
    uiDataCount : UINT;
    pData : OCL.CAA.PVOID;
    szSize : OCL.CAA.SIZE;
    xDone : BOOL := FALSE;
    pstDSendResult: POINTER TO MB_EXCHANGE_RESULT;
    peError : POINTER TO OCL.ERROR;
    ltStartUpd : POINTER TO LTIME;
    ltEndUpd : POINTER TO LTIME;
    END_STRUCT
    END_TYPE

    В главной программе есть конвеер обмена данными что-то такое:

    fbComControl
    (
    xEnable := TRUE,
    udiComPort := 4,
    udiBaudRate := 38400,
    udiByteSize := 8,
    eParity := OCL.COM_PARITY.EVEN,
    eStopBit := OCL.COM_STOPBIT.ONE,
    hCom => hCom
    );

    IF fbComControl.xActive AND NOT fbComControl.xError THEN
    CASE enMBHStage OF
    E_MBHSTAGE.CheckBuffer:
    IF NOT fbMbStack.xStackEmpty THEN
    stModbusStack := fbMbStack.Pop();
    stModbusStack.pstDSendResult^.tSendDataStart:= TO_TIME(TargetVars.stRtc.ltSystemTick);
    stModbusStack.pstDSendResult^.tSendData := TO_TIME(0);
    stModbusStack.ltStartUpd^ :=
    stModbusStack.ltEndUpd^ := TargetVars.stRtc.ltSystemTick;
    stModbusStack.pstDSendResult^.eError := OCL.ERROR.NO_ERROR;
    stModbusStack.pstDSendResult^.eTxtError := MB_COMM_ERRORS.NO_ERROR;
    actProcessRequest();
    END_IF
    E_MBHSTAGE.SendData:
    actProcessRequest();
    END_CASE
    END_IF

    Действие actProcessRequest();

    fbSerialRequest
    (
    xExecute := TRUE,
    hCom := hCom,
    tTimeout := T#500MS,
    usiRetry := 3,
    xIsAsciiMode:= FALSE,
    usiSlaveId := stModbusStack.usiSlaveId,
    eFuncCode := stModbusStack.eFuncCode,
    uiDataAddr := stModbusStack.uiDataAddr,
    uiDataCount := stModbusStack.uiDataCount,
    pData := stModbusStack.pData,
    szSize := stModbusStack.szSize
    );
    IF fbSerialRequest.xError OR fbSerialRequest.xDone THEN
    stModbusStack.pstDSendResult^.tSendData := TO_TIME(TargetVars.stRtc.ltSystemTick);
    timeToExchangeData := stDSendResult.tSendData - stDSendResult.tSendDataStart;
    stModbusStack.pstDSendResult^.eError := fbSerialRequest.eError;
    stModbusStack.pstDSendResult^.eTxtError := MbErr2Text(error := stModbusStack.pstDSendResult^.eError);
    stModbusStack.ltEndUpd^ := TargetVars.stRtc.ltSystemTick;
    IF fbSerialRequest.xError THEN
    stModbusStack.ltEndUpd^ := TO_LTIME(0);
    END_IF
    fbSerialRequest(xExecute := FALSE);
    enMBHStage := E_MBHSTAGE.CheckBuffer;
    ELSE
    enMBHStage := E_MBHSTAGE.SendData;
    END_IF

    Каждое устройство у меня реализовано как ФБ и при инициализации я для устройства назначаю указатель на стек, а каждый стек привязан к определенному последовательному порту.

    В чем у меня сейчас возникла проблема: я хотел бы сделать этот функционал максимально универсальным. Но немного не хватает опыта, был бы признателен если бы мне подсказали как лучше это сделать
    Сейчас я сделал интерфейс в котором описал базовые методы: FB_Init и FB_Status
    А дальше начинаются танцы с бубном
    У меня несколько устройств - Драйвер сервопривода, Частотный преобразователь и (допустим) расширение входов/выходов работающие по Modbus
    Было бы неплохо сделать иерархию объектов от Интерфейса и последовательно наследование с расширением функционала. Но пока выходит корявенько

    Може у кого есть похожая реализация или мысли или может объединим усилия и создадим нечто универсальное что поможет управлять устройствами по шине максимально гибко

    Это на самом деле очень удобно. Я реализовал портального робота с использованием СПК-110. Все управление осями идет через Modbus скорость очень приемлемая около 10мС на обмен с одним устройством. А так как RS485 у этого СПК аж 4 то получается что для всех 3-х осей обмен занимает не более 10-15 милисекунд.
    Вобщем хотел бы обсудить такой подход
    Каждый в меру своего понимания работает на себя, а в меру непонимания на того, кто понимает больше!

  2. #1072

    По умолчанию

    День добрый. Подскажите, каким-то образом можно организовать взаимодействие ПЛК Овен со сторонними приборами по CAN- шине?

  3. #1073

    По умолчанию

    Цитата Сообщение от Лесурмыг Посмотреть сообщение
    День добрый. Подскажите, каким-то образом можно организовать взаимодействие ПЛК Овен со сторонними приборами по CAN- шине?
    Добрый день.
    У наших ПЛК нет CAN-интерфейса, так что осуществить связь со сторонними приборами можно будет только с использование дополнительного устройства-конвертера (например, Modbus/CANopen).

  4. #1074

    По умолчанию

    Можно ли менять значения на вкладке "Modbus Slave Init" из программы?

  5. #1075

    По умолчанию

    Цитата Сообщение от Tacio Посмотреть сообщение
    Можно ли менять значения на вкладке "Modbus Slave Init" из программы?
    Такой возможности нет.

  6. #1076

    По умолчанию

    Здравствуйте. Подскажите, можно ли сделать так, чтобы регистры временного хранения обнулялись при потере связи внешнего Master-устройста (Modbus TCP) с ПЛК210?
    В моём случае Мастер - СП310. Сейчас отсоединяю кабель, но "ModbusTCP SlaveDevice" в Codesus 3.5 так и горит зелёным (не уходит в ошибку) и данные в регистрах, соответственно, остаются последние записанные.

  7. #1077

    По умолчанию

    Цитата Сообщение от jtx Посмотреть сообщение
    Здравствуйте. Подскажите, можно ли сделать так, чтобы регистры временного хранения обнулялись при потере связи внешнего Master-устройста (Modbus TCP) с ПЛК210?
    В моём случае Мастер - СП310. Сейчас отсоединяю кабель, но "ModbusTCP SlaveDevice" в Codesus 3.5 так и горит зелёным (не уходит в ошибку) и данные в регистрах, соответственно, остаются последние записанные.
    Добрый день.
    Да, для этого достаточно поставить галочку Сторожевой таймер в настройках слэйва и указать время отсутствия запросов, спустя которое значения регистров будут обнулены.

  8. #1078

    По умолчанию

    Пишу в панель по snmp некое отрицательное число. Типы integer32 и dint. Почему числа больше -128 приходят как разница этих чисел и 256? Например, число -200 будет 65336 и интерпретируется как -200, а -4 превращается в 252.

  9. #1079

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Добрый день.
    Да, для этого достаточно поставить галочку Сторожевой таймер в настройках слэйва и указать время отсутствия запросов, спустя которое значения регистров будут обнулены.
    Сторожевой таймер галочка стоит, время пробовал разное (сейчас стоит 1000мс), но на состояние слэйва она никак не влияет. А что за "время отсутствия запросов", где этот пункт находится?

  10. #1080

    По умолчанию

    Цитата Сообщение от jtx Посмотреть сообщение
    Сторожевой таймер галочка стоит, время пробовал разное (сейчас стоит 1000мс), но на состояние слэйва она никак не влияет. А что за "время отсутствия запросов", где этот пункт находится?
    Справа от галочки Сторожевой таймер.
    Уточните, а галочка Запись у вас установлена?

Страница 108 из 174 ПерваяПервая ... 85898106107108109110118158 ... ПоследняяПоследняя

Похожие темы

  1. Настройка ПР200, управление 3-мя устройствами через RS-485
    от Orbes в разделе Среда программирования OWEN Logic
    Ответов: 20
    Последнее сообщение: 15.05.2017, 16:45
  2. СП3ХХ Пример настройка обмена с ПЛК на CODESYS 2.3
    от Denis_Kay в разделе СП3хх, СП270
    Ответов: 6
    Последнее сообщение: 02.03.2017, 15:12
  3. Ответов: 43
    Последнее сообщение: 13.04.2015, 14:05
  4. Универсальная функция для обмена с устройствами OwenIO и всеми любимый LabView.
    от Алексей Крагель в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 30.05.2014, 13:38

Ваши права

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