Проверьте сгенерированный код при помощи Cosimulation

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

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

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

  • Codesys V3.5. SP16 + IDE или закрашенная фигура Codesys V3.5 SP16 1 + IDE

  • OPC Toolbox ™

  • Simulink PLC Coder ™

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

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

SimpleSubsystem блок содержит простую обратную связь.

Система MATLAB блок настраивается, чтобы запустить PLCCOSIM.m файл. Файл содержит код, чтобы настроить коммуникации UA OPC и получить cosimulated данные от мягкого PLC.

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 запускает сгенерированный код на мягком PLC. Если у вас есть Codesys V3.5. SP16 + IDE, используйте plc-cosim_v3sp16.project как проект файл. Если у вас есть Codesys V3.5. Закрашенная фигура SP16 1 + IDE, используйте plc-cosim_v3sp16patch1.project как проект файл.

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

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

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

  4. Во вкладке Scan Network выберите свое устройство в Избранном Окне устройств. Нажать ОК.

  5. Выберите Build> Build.

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

7. Выберите Debug> Start.

Мягкий PLC теперь запускает сгенерированный код.

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

Симулируйте Simulink ™ модель и проверьте, что сгенерированный код путем сравнения результатов имитационной модели с мягким PLC results.The мягкие результаты PLC получен при помощи связи UA OPC.

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

% open_system('simple_cosim')

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

Смотрите также