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

Тема: 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
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,230

    По умолчанию

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

  4. #1074

    По умолчанию

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

  5. #1075
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,230

    По умолчанию

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

  6. #1076

    По умолчанию

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

  7. #1077
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,230

    По умолчанию

    Цитата Сообщение от 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
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,230

    По умолчанию

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

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

Похожие темы

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

Ваши права

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