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

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

Необходимые условия

В вашей системе необходимо установить:

  • Codesys V3.5.SP16 + IDE или Codesys V3.5 SP16 Patch 1 + IDE

  • OPC Toolbox ™

  • Simulink PLC Coder ™

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

The simple_cosim модель состоит из SimpleSubsystem блок и система MATLAB (PLCCOSIM) блок. Во время симуляции модель сравнивает значения из SimpleSubsystem блок к значениям из мягкого ПЛК, которые извлекаются с помощью системы 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. Откройте файл проекта на основе версии Codesys Target IDE.

  3. Дважды кликните CODESYS_Control_Win_V3_x64 и выберите Скан Network.

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

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

6.Выбрать Online > Войти.

7. Выберите отладка > Start.

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

Симулируйте модель и проверьте сгенерированный код

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

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

% open_system('simple_cosim')

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

См. также