Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

PLC WinNT и системные библиотеки

Общий
March
2013-02-28
2013-03-03
  • March

    March - 2013-02-28

    Доброго времени суток! Интересует следующий вопрос:

    Хочу использовать PLC WinNT для тестирования программы без использования контроллера. Скажем, программа читает данные с приборов по Modbus RTU, взаимодействует со SCADA через Modbus TCP. Для этих целей в CoDeSys можно использовать системные библиотеки SysLibCom и SysLibSockets. Они платформозависимые. Для контроллера они уже использовались (в данном случае использую контроллеры ОВЕН). Как я понимаю, для симулятора должны быть свои реализации этих библиотек.

    Теперь возникает вопрос - где их найти?
    Смотрел во всех каталогах установленных CoDeSys - не нашел. На сайте codesys.com ничего подобного тоже не нашел.

     
  • March

    March - 2013-03-01

    Прошу прощения за глупый пост . У себя нашел в директории "C:\Program Files\Common Files\CAA-Targets\3S\Lib_PLCWinNT".

     
  • March

    March - 2013-03-03

    Здравствуйте! Опять вопрос по PLC WinNT и библиотеке SysLibSockets. C помощью данной библиотеки удалось реализовать TCP клиент. Все нормально, вроде работает. Далее пытаюсь реализовать ТСР сервер. Вот тут посложнее. Вот кусок кода:

    VAR
       state         : SERV_STATE := SERV_INIT;
       sock, sock_acc   : DINT;
       tcp_adr      : SOCKADDRESS;
       acc_adr      : SOCKADDRESS;
       res         : BOOL;
       param_ctrl      : DINT;
       InBuff         : ARRAY[1..300] OF BYTE;
       OutBuff      : ARRAY[1..300] OF BYTE;
    END_VAR
    ....
    CASE state OF
    SERV_INIT:      (* SOCK CREATE *)
        sock   := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
        state   := SERV_SETUP;
    SERV_SETUP:      (* SOCK SETUP *)
        param_ctrl      := 1;
        tcp_adr.sin_family   := SOCKET_AF_INET;
        tcp_adr.sin_port   := SysSockNtohs(502);
        tcp_adr.sin_addr   := SOCKET_INADDR_ANY;
        res         := SysSockBind(sock, ADR(tcp_adr), SIZEOF(tcp_adr));
        SysSockIoctl(sock,SOCKET_FIONBIO,ADR(param_ctrl)); (* Non blocking mode *)
        res         := SysSockListen(sock, 1);
        state         := SERV_ACC;
    SERV_ACC:      (* WAIT FOR CONNECTION *)
        sock_acc   := SysSockAccept(sock, ADR(acc_adr), SIZEOF(acc_adr));
        IF (sock_acc = 16#FFFFFFFF) THEN
            RETURN;
        ELSIF (sock_acc = 0) THEN
            RETURN;
        ELSE
            state := SERV_RCV;
        END_IF;
    SERV_RCV:      (* WAIT FOR REQUEST *)
    ...
    END_CASE
    

    При попытке подключения вылетает функция SysSockAccept и выдается ошибка: "#81: Access violation in 'Access violation Task = DefaultTask'"...
    Возможно кто-то сталкивался с подобным. Пробовал разные варианты - блокирующий/неблокирующий режим, пробовал SysSockSelect... В чем может проблема? Работает ли данная библиотечная функция для PLC WinNT? Или данную задачу не решить c помощью SysLibSockets
    для PLC WinNT? Если нужен будет проект - я выложу.