exponenta event banner

Проверка созданного кода с помощью косимуляции

Проверьте созданный код с помощью косимуляции. Сгенерированные код и средства тестирования выполняются на программно-программируемом логическом контроллере Codesys (программном ПЛК). Модель Simulink ™ использует единую архитектуру связи с открытой платформой (OPC UA) для связи и извлечения косимулированных данных из программного ПЛК. Модель Simulink проверяет сгенерированный код, сравнивая результаты моделирования модели с результатами косимулированного мягкого ПЛК.

Предпосылки

В системе должны быть установлены:

  • Codesys V3.5.SP16 + IDE или Codesys V3.5 SP16 Исправление 1 + IDE

  • Панель инструментов OPC ™

  • Кодер Simulink PLC ™

Описание модели

В simple_cosim модель состоит из SimpleSubsystem блок и система MATLAB (PLCCOSIM) блок. Во время моделирования модель сравнивает значения из SimpleSubsystem блокировать значения из программного plc, которые извлекаются с помощью системы MATLAB (PLCCOSIM) блок.

SimpleSubsystem блок содержит простой цикл обратной связи.

Система MATLAB блок настроен на запуск PLCCOSIM.m файл. Файл содержит код для настройки связи OPC UA и извлечения косимулированных данных из программного ПЛК.

type PLCCOSIM.m
classdef PLCCOSIM < matlab.System
    % PLCCOSIM Add summary here
    %
    % This template includes the minimum set of functions required
    % to define a System object with discrete state.

    % Public, tunable properties
    properties

    end

    properties(DiscreteState)
        CycleNum;
    end

    % Pre-computed constants
    properties(Access = private)
        UAObj;
        DeviceNode;
        Cycle_U;
        Cycle_Y;
        TestCycleNum;
        PreviousCycleNum;
    end

    methods(Access = protected)
        function setupImpl(obj)
            % Perform one-time calculations, such as computing constants
            % init opc UA server connection
            obj.UAObj = opcua('opc.tcp://localhost:4840');
            connect(obj.UAObj);
            obj.DeviceNode = findNodeByName(obj.UAObj.Namespace,'DeviceSet','-once');
            obj.Cycle_U = findNodeByName(obj.DeviceNode,'cycle_U');
            obj.Cycle_Y = findNodeByName(obj.DeviceNode,'cycle_Y');
            obj.TestCycleNum = findNodeByName(obj.DeviceNode,'testCycleNum');
            obj.PreviousCycleNum = findNodeByName(obj.DeviceNode,'previousCycleNum');                            
        end

        function y = stepImpl(obj,u)
            % Implement algorithm. Calculate y as a function of input u and
            % discrete states.            
            obj.CycleNum = obj.CycleNum+1;
            writeValue(obj.UAObj, obj.Cycle_U, u);
            writeValue(obj.UAObj, obj.TestCycleNum, obj.CycleNum);

            valueUpdated = false;
            for rct = 1:100
                previousCycleNumValue = readValue(obj.UAObj, obj.PreviousCycleNum);
                if previousCycleNumValue == obj.CycleNum
                    valueUpdated = true;
                    y = readValue(obj.UAObj, obj.Cycle_Y);             
                    break
                end
                pause(0.001)
            end        

            if ~valueUpdated
                error('not get the value for cycle number %d', obj.CycleNum);
            end                
        end

        function resetImpl(obj)
            % Initialize / reset discrete-state properties
            obj.CycleNum = 0;
            writeValue(obj.UAObj, obj.TestCycleNum, obj.CycleNum);
            writeValue(obj.UAObj, obj.PreviousCycleNum, obj.CycleNum);
        end
        
        function out = getOutputSizeImpl(obj)
            out = propagatedInputSize(obj,1);
        end
        
        function out = getOutputDataTypeImpl(obj)
            out = propagatedInputDataType(obj,1);
        end
      
        function c1 = isOutputComplexImpl(obj)
            c1 = false;
        end
   
        function c1 = isOutputFixedSizeImpl(obj)
            c1 = true;
        end
   
        function s = getDiscreteStateImpl(obj)
            s = obj.CycleNum;
        end
    end
end

Компиляция и моделирование проекта Codesys

Файл проекта Codesys запускает созданный код на программном ПЛК. При наличии Codesys V3.5.SP16 + IDE используйте plc-cosim_v3sp16.project в качестве проекта файл. При наличии пакета Codesys V3.5.SP16 Patch 1 + IDE используйте plc-cosim_v3sp16patch1.project в качестве проекта файл.

  1. На панели задач Windows ® выберите CODESYS Control Win SysTray -x64, щелкните правой кнопкой мыши и выберите Start PLC.

  2. Откройте файл проекта на основе версии целевой среды IDE Codesys.

  3. Двойной щелчок CODESYS_Control_Win_V3_x64 и выберите Сканировать сеть.

  4. На вкладке Сканирование сети выберите устройство в окне Выбор устройства. Нажмите кнопку ОК.

  5. Выберите «Сборка» > «Сборка».

6.Выберите «Online» > «Login».

7. Выберите Отладка > Пуск.

Теперь на программном ПЛК выполняется сгенерированный код.

Моделирование модели и проверка сгенерированного кода

Смоделировать модель Simulink ™ и проверить созданный код путем сравнения результатов модели моделирования с результатами мягкого ПЛК. Результаты программного ПЛК извлекаются с помощью соединения OPC UA.

  1. Откройте окно simple_cosim.slx файл для Simulink модель.

% open_system('simple_cosim')

2. Моделирование модели. Проверьте созданный код, сравнив результаты моделирования модели с результатами косимуляции мягкого ПЛК.

См. также