Challenges getting 8 RELAY board to work in OpenPLC


  • I can not seem to get an a relay energized with my 8 relay boards.  I have a functioning input that when it is connected to  LED1 on the industrial board I can turn that LED on and off.  I disconnect from that LED and move over to the 8 relay and nothing.  I have also setup a output connected directly to the pin and set the initial value to 1 (tried it on both 8 relay boards in the stack.)

    I dropped a 16 relay board in there to try it also.  

    It must be something with my addressing in OPLC for the one that I have that works that lights up the LED1 on the IND board it is addressed %IX1.0   I have tried IX and QX just for the heck of it on the relay cards with no luck.  

    I can not seem to get any of the relays to pickup no matter what I have tried.  I have tried the 8relay boards a 16, and a 4 smart.  I am stumped on this one. 

     

     



  • Hi,

     

    Could you share the project you created in the Editor so I can take a look?

    This problem could also be generated by the port of Sequent drivers to the new runtime.

     


  • garagedo/program.st at main · jakefreese/garagedo

    I did just reinstsall wiringPI, and turned off SPI in interfaces.  The only ones on are I2C, Serial port, and Serial console.  

    I am using the new editor, I have not tried the v4 runtime with it yet.  (I was having enough challenges that I was not ready to jump on that yet. )  This weekend hopefully. 

     

    TYPE
      LIGHTING_STATE : (HOBBY_ON, HOBBY_OFF, OFFICE_ON, OFFICE_OFF);
    END_TYPE
    
    FUNCTION_BLOCK LIGHTING
      VAR
        OFFICE_ON : LIGHTING_STATE;
        OFFICE_OFF : LIGHTING_STATE;
        HOBBY_ON : LIGHTING_STATE;
        HOBBY_OFF : LIGHTING_STATE;
        TON3 : TON;
        TON4 : TON;
        DEB_TIME : TIME := T#500ms;
      END_VAR
      VAR_INPUT
        HOBBY_IN : BOOL;
        OFFICE_IN : BOOL;
      END_VAR
      VAR_OUTPUT
        HOBBY_OUT : BOOL;
        OFFICE_OUT : BOOL;
      END_VAR
    
      TON3(IN := HOBBY_IN, PT := DEB_TIME);
      HOBBY_OUT := TON3.Q;
      TON4(IN := OFFICE_IN, PT := DEB_TIME);
      OFFICE_OUT := TON4.Q;
    END_FUNCTION_BLOCK
    
    PROGRAM main
      VAR_INPUT
        SM_IND_STK : SINT := 0;
        SM_8RELAY0_STK : SINT := 1;
        SM_RTD_STK : SINT := 3;
        SM_HOME0_STK : SINT := 5;
        SM_16DIN0_STK : SINT := 6;
      END_VAR
      VAR
        SM_8RELAY1_STK : SINT := 2;
        SM_INDUSTRIAL0 : SM_INDUSTRIAL;
        SM_8RELAY0 : SM_8RELAY;
        SM_8RELAY1 : SM_8RELAY;
        SM_RTD0 : SM_RTD;
        SM_HOME0 : SM_HOME;
        SM_16DIN0 : SM_16DIN;
        TON0 : TON;
        LIGHTING0 : LIGHTING;
      END_VAR
      VAR
        DIN1 AT %QX0.0 : BOOL;
        DIN2 AT %QX0.1 : BOOL;
        OFFICE_LTS AT %QX1.0 : BOOL;
        OFFICE_LT AT %IX1.0 : BOOL;
        HOBBY_LTS AT %QX1.1 : BOOL;
        HOBBY_LT AT %IX1.1 : BOOL;
        L1 AT %IX0.0 : BOOL;
        L2 AT %IX0.1 : BOOL;
        L3 AT %IX0.2 : BOOL;
        L4 AT %IX0.4 : BOOL;
        R4 AT %IX1.3 : BOOL;
        R09 AT %IX2.0 : BOOL;
        OFFICE_TEMP AT %MD0 : REAL;
        GARAGE_TEMP AT %MD1 : REAL;
        ATTIC_TEMP AT %MD2 : REAL;
        HVAC_SUPPLY AT %MD3 : REAL;
        H_IN_1 AT %QX3.0 : BOOL;
        H_IN_2 AT %QX3.1 : BOOL;
        H_IN_3 AT %QX3.2 : BOOL;
        H_IN_4 AT %QX3.3 : BOOL;
        H_RLY_1 AT %IX3.0 : BOOL;
        H_RLY_2 AT %IX3.1 : BOOL;
        H_RLY_3 AT %IX3.2 : BOOL;
        H_RLY_4 AT %IX3.3 : BOOL;
        RLY1_4 AT %IX4.3 : BOOL;
        RLY2_4 AT %IX5.3 : BOOL;
      END_VAR
    
      SM_HOME0(STACK := SM_HOME0_STK, RELAY1 := H_RLY_1, RELAY2 := H_RLY_2, RELAY3 := H_RLY_3, RELAY4 := H_RLY_4);
      SM_8RELAY0(STACK := SM_8RELAY0_STK);
      SM_INDUSTRIAL0(STACK := SM_IND_STK, LED1 := HOBBY_LT);
      SM_16DIN0(STACK := SM_16DIN0_STK);
      LIGHTING0(HOBBY_IN := SM_16DIN0.I1, OFFICE_IN := SM_16DIN0.I2);
      HOBBY_LTS := SM_16DIN0.I1;
      HOBBY_LT := LIGHTING0.HOBBY_OUT;
      OFFICE_LTS := SM_16DIN0.I2;
      OFFICE_LT := LIGHTING0.OFFICE_OUT;
      SM_8RELAY1(STACK := SM_8RELAY1_STK);
      SM_RTD0(STACK := SM_RTD_STK);
      OFFICE_TEMP := SM_RTD0.TEMP1;
      H_IN_1 := SM_HOME0.OPTO1;
      GARAGE_TEMP := SM_RTD0.TEMP2;
      H_IN_2 := SM_HOME0.OPTO2;
      ATTIC_TEMP := SM_RTD0.TEMP3;
      H_IN_3 := SM_HOME0.OPTO3;
      HVAC_SUPPLY := SM_RTD0.TEMP4;
      H_IN_4 := SM_HOME0.OPTO4;
    END_PROGRAM
    
    
    CONFIGURATION Config0
    
      RESOURCE Res0 ON PLC
        TASK task0(INTERVAL := T#50ms,PRIORITY := 1);
        PROGRAM instance0 WITH task0 : main;
      END_RESOURCE
    END_CONFIGURATION
    
    (*DBG:char md5[] = "e14823d02f55e3cf330e4b776ca09a2a";*)
    (*DBG:/**)
    (*DBG: * This file is part of OpenPLC Runtime*)
    (*DBG: **)
    (*DBG: * Copyright (C) 2023 Autonomy, GP Orcullo*)
    (*DBG: * Based on the work by GP Orcullo on Beremiz for uC*)
    (*DBG: **)
    (*DBG: * This program is free software; you can redistribute it and/or*)
    (*DBG: * modify it under the terms of the GNU General Public License*)
    (*DBG: * as published by the Free Software Foundation; either version 2*)
    (*DBG: * of the License, or (at your option) any later version.*)
    (*DBG: **)
    (*DBG: * This program is distributed in the hope that it will be useful,*)
    (*DBG: * but WITHOUT ANY WARRANTY; without even the implied warranty of*)
    (*DBG: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the*)
    (*DBG: * GNU General Public License for more details.*)
    (*DBG: **)
    (*DBG: * You should have received a copy of the GNU General Public License*)
    (*DBG: * along with this program; If not, see <http://www.gnu.org/licenses/>.*)
    (*DBG: **)
    (*DBG: */*)
    (*DBG:*)
    (*DBG:#include <stdbool.h>*)
    (*DBG:*)
    (*DBG:// Include defines.h first for Arduino builds to set USE_*_BLOCKS macros*)
    (*DBG:// before iec_std_FB.h processes its conditional includes*)
    (*DBG:#ifdef ARDUINO*)
    (*DBG:#include "../examples/Baremetal/defines.h"*)
    (*DBG:#endif*)
    (*DBG:*)
    (*DBG:#include "iec_types_all.h"*)
    (*DBG:#include "POUS.h"*)
    (*DBG:*)
    (*DBG:#define SAME_ENDIANNESS      0*)
    (*DBG:#define REVERSE_ENDIANNESS   1*)
    (*DBG:*)
    (*DBG:char plc_program_md5[] = "e14823d02f55e3cf330e4b776ca09a2a";*)
    (*DBG:*)
    (*DBG:uint8_t endianness;*)
    (*DBG:*)
    (*DBG:*)
    (*DBG:extern MAIN RES0__INSTANCE0;*)
    (*DBG:*)
    (*DBG:static const struct {*)
    (*DBG:    void *ptr;*)
    (*DBG:    __IEC_types_enum type;*)
    (*DBG:} debug_vars[] = {*)
    (*DBG:    {&(RES0__INSTANCE0.SM_IND_STK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0_STK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD_STK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0_STK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0_STK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1_STK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.STACK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.LED1), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.LED2), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.LED3), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.LED4), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q0_10V1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q0_10V2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q0_10V3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q0_10V4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q4_20MA1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q4_20MA2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q4_20MA3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.Q4_20MA4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.QOD1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.QOD2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.QOD3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.QOD4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OPTO1), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OPTO2), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OPTO3), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OPTO4), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I0_10V1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I0_10V2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I0_10V3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I0_10V4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I4_20MA1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I4_20MA2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I4_20MA3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.I4_20MA4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OWB_T1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OWB_T2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OWB_T3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_INDUSTRIAL0.OWB_T4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.STACK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O1), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O2), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O3), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O4), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O5), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O6), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O7), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.O8), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY0.DUMMY), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.STACK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O1), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O2), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O3), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O4), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O5), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O6), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O7), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.O8), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_8RELAY1.DUMMY), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.STACK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP5), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP6), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP7), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_RTD0.TEMP8), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.STACK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY1), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY2), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY3), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY4), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY5), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY6), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY7), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.RELAY8), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.Q0_10V1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.Q0_10V2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.Q0_10V3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.Q0_10V4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.QOD1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.QOD2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.QOD3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.QOD4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO1), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO2), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO3), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO4), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO5), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO6), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO7), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OPTO8), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC5), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC6), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC7), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.ADC8), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OWB_T1), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OWB_T2), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OWB_T3), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_HOME0.OWB_T4), REAL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.STACK), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I1), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I2), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I3), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I4), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I5), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I6), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I7), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I8), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I9), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I10), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I11), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I12), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I13), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I14), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I15), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.SM_16DIN0.I16), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.PT), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.Q), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.ET), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.STATE), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.PREV_IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.CURRENT_TIME), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.TON0.START_TIME), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.PT), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.Q), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.ET), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.STATE), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.PREV_IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.CURRENT_TIME), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON3.START_TIME), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.EN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.ENO), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.PT), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.Q), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.ET), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.STATE), SINT_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.PREV_IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.CURRENT_TIME), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.TON4.START_TIME), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.DEB_TIME), TIME_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.HOBBY_IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.OFFICE_IN), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.HOBBY_OUT), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.LIGHTING0.OFFICE_OUT), BOOL_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.DIN1), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.DIN2), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.OFFICE_LTS), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.OFFICE_LT), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.HOBBY_LTS), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.HOBBY_LT), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.L1), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.L2), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.L3), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.L4), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.R4), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.R09), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.OFFICE_TEMP), REAL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.GARAGE_TEMP), REAL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.ATTIC_TEMP), REAL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.HVAC_SUPPLY), REAL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_IN_1), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_IN_2), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_IN_3), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_IN_4), BOOL_O_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_RLY_1), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_RLY_2), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_RLY_3), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.H_RLY_4), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.RLY1_4), BOOL_P_ENUM},*)
    (*DBG:    {&(RES0__INSTANCE0.RLY2_4), BOOL_P_ENUM},*)
    (*DBG:};*)
    (*DBG:*)
    (*DBG:#define VAR_COUNT               197*)
    (*DBG:*)
    (*DBG:uint16_t get_var_count(void)*)
    (*DBG:{*)
    (*DBG:    return VAR_COUNT;*)
    (*DBG:}*)
    (*DBG:*)
    (*DBG:size_t get_var_size(size_t idx)*)
    (*DBG:{*)
    (*DBG:    if (idx >= VAR_COUNT)*)
    (*DBG:    {*)
    (*DBG:        return 0;*)
    (*DBG:    }*)
    (*DBG:    switch (debug_vars[idx].type) {*)
    (*DBG:    case BOOL_ENUM:*)
    (*DBG:    case BOOL_O_ENUM:*)
    (*DBG:    case BOOL_P_ENUM:*)
    (*DBG:        return sizeof(BOOL);*)
    (*DBG:    case SINT_ENUM:*)
    (*DBG:        return sizeof(SINT);*)
    (*DBG:    case TIME_ENUM:*)
    (*DBG:        return sizeof(TIME);*)
    (*DBG:    case REAL_ENUM:*)
    (*DBG:    case REAL_O_ENUM:*)
    (*DBG:        return sizeof(REAL);*)
    (*DBG:    default:*)
    (*DBG:        return 0;*)
    (*DBG:    }*)
    (*DBG:}*)
    (*DBG:*)
    (*DBG:void *get_var_addr(size_t idx)*)
    (*DBG:{*)
    (*DBG:    void *ptr = debug_vars[idx].ptr;*)
    (*DBG:*)
    (*DBG:    switch (debug_vars[idx].type) {*)
    (*DBG:    case BOOL_ENUM:*)
    (*DBG:        return (void *)&((__IEC_BOOL_t *) ptr)->value;*)
    (*DBG:    case BOOL_O_ENUM:*)
    (*DBG:    case BOOL_P_ENUM:*)
    (*DBG:        return (void *)((((__IEC_BOOL_p *) ptr)->flags & __IEC_FORCE_FLAG)*)
    (*DBG:                        ? &(((__IEC_BOOL_p *) ptr)->fvalue)*)
    (*DBG:                        : ((__IEC_BOOL_p *) ptr)->value);*)
    (*DBG:    case SINT_ENUM:*)
    (*DBG:        return (void *)&((__IEC_SINT_t *) ptr)->value;*)
    (*DBG:    case TIME_ENUM:*)
    (*DBG:        return (void *)&((__IEC_TIME_t *) ptr)->value;*)
    (*DBG:    case REAL_ENUM:*)
    (*DBG:        return (void *)&((__IEC_REAL_t *) ptr)->value;*)
    (*DBG:    case REAL_O_ENUM:*)
    (*DBG:        return (void *)((((__IEC_REAL_p *) ptr)->flags & __IEC_FORCE_FLAG)*)
    (*DBG:                        ? &(((__IEC_REAL_p *) ptr)->fvalue)*)
    (*DBG:                        : ((__IEC_REAL_p *) ptr)->value);*)
    (*DBG:    default:*)
    (*DBG:        return 0;*)
    (*DBG:    }*)
    (*DBG:}*)
    (*DBG:*)
    (*DBG:void force_var(size_t idx, bool forced, void *val)*)
    (*DBG:{*)
    (*DBG:    void *ptr = debug_vars[idx].ptr;*)
    (*DBG:*)
    (*DBG:    if (forced) {*)
    (*DBG:        size_t var_size = get_var_size(idx);*)
    (*DBG:        switch (debug_vars[idx].type) {*)
    (*DBG:        case BOOL_ENUM: {*)
    (*DBG:            memcpy(&((__IEC_BOOL_t *) ptr)->value, val, var_size);*)
    (*DBG:            ((__IEC_BOOL_t *) ptr)->flags |= __IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:    *)
    (*DBG:        case BOOL_O_ENUM: {*)
    (*DBG:            memcpy((((__IEC_BOOL_p *) ptr)->value), val, var_size);*)
    (*DBG:            memcpy(&((__IEC_BOOL_p *) ptr)->fvalue, val, var_size);*)
    (*DBG:            ((__IEC_BOOL_p *) ptr)->flags |= __IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:        case BOOL_P_ENUM: {*)
    (*DBG:            memcpy(&((__IEC_BOOL_p *) ptr)->fvalue, val, var_size);*)
    (*DBG:            ((__IEC_BOOL_p *) ptr)->flags |= __IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:        case SINT_ENUM: {*)
    (*DBG:            memcpy(&((__IEC_SINT_t *) ptr)->value, val, var_size);*)
    (*DBG:            ((__IEC_SINT_t *) ptr)->flags |= __IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:    *)
    (*DBG:        case TIME_ENUM: {*)
    (*DBG:            memcpy(&((__IEC_TIME_t *) ptr)->value, val, var_size);*)
    (*DBG:            ((__IEC_TIME_t *) ptr)->flags |= __IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:    *)
    (*DBG:        case REAL_ENUM: {*)
    (*DBG:            memcpy(&((__IEC_REAL_t *) ptr)->value, val, var_size);*)
    (*DBG:            ((__IEC_REAL_t *) ptr)->flags |= __IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:    *)
    (*DBG:        case REAL_O_ENUM: {*)
    (*DBG:            memcpy((((__IEC_REAL_p *) ptr)->value), val, var_size);*)
    (*DBG:            memcpy(&((__IEC_REAL_p *) ptr)->fvalue, val, var_size);*)
    (*DBG:            ((__IEC_REAL_p *) ptr)->flags |= __IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:        default:*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:    } else {*)
    (*DBG:        switch (debug_vars[idx].type) {*)
    (*DBG:        case BOOL_ENUM:*)
    (*DBG:            ((__IEC_BOOL_t *) ptr)->flags &= ~__IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        case BOOL_O_ENUM:*)
    (*DBG:        case BOOL_P_ENUM:*)
    (*DBG:            ((__IEC_BOOL_p *) ptr)->flags &= ~__IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        case SINT_ENUM:*)
    (*DBG:            ((__IEC_SINT_t *) ptr)->flags &= ~__IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        case TIME_ENUM:*)
    (*DBG:            ((__IEC_TIME_t *) ptr)->flags &= ~__IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        case REAL_ENUM:*)
    (*DBG:            ((__IEC_REAL_t *) ptr)->flags &= ~__IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        case REAL_O_ENUM:*)
    (*DBG:            ((__IEC_REAL_p *) ptr)->flags &= ~__IEC_FORCE_FLAG;*)
    (*DBG:            break;*)
    (*DBG:        default:*)
    (*DBG:            break;*)
    (*DBG:        }*)
    (*DBG:    }*)
    (*DBG:}*)
    (*DBG:*)
    (*DBG:void swap_bytes(void *ptr, size_t size)*)
    (*DBG:{*)
    (*DBG:    uint8_t *bytePtr = (uint8_t *)ptr;*)
    (*DBG:    size_t i;*)
    (*DBG:    for (i = 0; i < size / 2; ++i)*)
    (*DBG:    {*)
    (*DBG:        uint8_t temp = bytePtr[i];*)
    (*DBG:        bytePtr[i] = bytePtr[size - 1 - i];*)
    (*DBG:        bytePtr[size - 1 - i] = temp;*)
    (*DBG:    }*)
    (*DBG:}*)
    (*DBG:*)
    (*DBG:void trace_reset(void)*)
    (*DBG:{*)
    (*DBG:    for (size_t i=0; i < VAR_COUNT; i++)*)
    (*DBG:    {*)
    (*DBG:        force_var(i, false, 0);*)
    (*DBG:    }*)
    (*DBG:}*)
    (*DBG:*)
    (*DBG:void set_trace(size_t idx, bool forced, void *val)*)
    (*DBG:{*)
    (*DBG:    if (idx >= 0 && idx < VAR_COUNT)*)
    (*DBG:    {*)
    (*DBG:        if (endianness == REVERSE_ENDIANNESS)*)
    (*DBG:        {*)
    (*DBG:            // Prevent swapping for STRING type*)
    (*DBG:            if (debug_vars[idx].type == STRING_ENUM)*)
    (*DBG:            {*)
    (*DBG:                // Do nothing*)
    (*DBG:                ;*)
    (*DBG:            }*)
    (*DBG:            else*)
    (*DBG:            {*)
    (*DBG:                swap_bytes(val, get_var_size(idx));*)
    (*DBG:            }*)
    (*DBG:        }*)
    (*DBG:*)
    (*DBG:        force_var(idx, forced, val);*)
    (*DBG:    }*)
    (*DBG:}*)
    (*DBG:*)
    (*DBG:void set_endianness(uint8_t value)*)
    (*DBG:{*)
    (*DBG:    if (value == SAME_ENDIANNESS || value == REVERSE_ENDIANNESS)*)
    (*DBG:    {*)
    (*DBG:        endianness = value;*)
    (*DBG:    }*)
    (*DBG:}*)
    (*DBG:*)
    (*FILE:c_blocks.h // Empty file *)
    (*FILE:c_blocks.h  *)
    (*FILE:c_blocks_code.cpp #include <stdint.h> *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp #ifdef ARDUINO *)
    (*FILE:c_blocks_code.cpp #include <Arduino.h> *)
    (*FILE:c_blocks_code.cpp #endif *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp /*********************/ *)
    (*FILE:c_blocks_code.cpp /*  IEC Types defs   */ *)
    (*FILE:c_blocks_code.cpp /*********************/ *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp typedef uint8_t  IEC_BOOL; *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp typedef int8_t    IEC_SINT; *)
    (*FILE:c_blocks_code.cpp typedef int16_t   IEC_INT; *)
    (*FILE:c_blocks_code.cpp typedef int32_t   IEC_DINT; *)
    (*FILE:c_blocks_code.cpp typedef int64_t   IEC_LINT; *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp typedef uint8_t    IEC_USINT; *)
    (*FILE:c_blocks_code.cpp typedef uint16_t   IEC_UINT; *)
    (*FILE:c_blocks_code.cpp typedef uint32_t   IEC_UDINT; *)
    (*FILE:c_blocks_code.cpp typedef uint64_t   IEC_ULINT; *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp typedef uint8_t    IEC_BYTE; *)
    (*FILE:c_blocks_code.cpp typedef uint16_t   IEC_WORD; *)
    (*FILE:c_blocks_code.cpp typedef uint32_t   IEC_DWORD; *)
    (*FILE:c_blocks_code.cpp typedef uint64_t   IEC_LWORD; *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp typedef float    IEC_REAL; *)
    (*FILE:c_blocks_code.cpp typedef double   IEC_LREAL; *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp #ifndef STR_MAX_LEN *)
    (*FILE:c_blocks_code.cpp #define STR_MAX_LEN 126 *)
    (*FILE:c_blocks_code.cpp #endif *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp #ifndef STR_LEN_TYPE *)
    (*FILE:c_blocks_code.cpp #define STR_LEN_TYPE int8_t *)
    (*FILE:c_blocks_code.cpp #endif *)
    (*FILE:c_blocks_code.cpp  *)
    (*FILE:c_blocks_code.cpp typedef STR_LEN_TYPE __strlen_t; *)
    (*FILE:c_blocks_code.cpp typedef struct { *)
    (*FILE:c_blocks_code.cpp     __strlen_t len; *)
    (*FILE:c_blocks_code.cpp     uint8_t body[STR_MAX_LEN]; *)
    (*FILE:c_blocks_code.cpp } IEC_STRING; *)
    (*FILE:c_blocks_code.cpp  *)

  • Ok, I was expecting the project on the OpenPLC editor, not the file you load to the runtime. I hope I can manage to debug it.

    I understand this was tested with runtime v3, but which editor version were these created in?

     


  • sorry, I meant to upload the whole project and just the .st  The whole project is in the zip document in the github link now

    It is Editor v4  


  • I think that is a problem, use editor V4 with runtime V3. You should ask OpenPLC whether you can mix V3 and V4, but I think not. Otherwise, why not upgrade V3 to V4? They created separate repositories for V4 (editor and runtime).

    My advice, before I struggle to debug the program (I must mention that my skills with OpenPLC or any PLC language are limited), is to use V3 or V4 for both runtime and editor.

     


  • I am going to try the matched versions in the morning and I will let you know how that goes.  It is supposed to work with the V4 editor and the v3 runtime.  You can select which runtime when you compile your program.  Hopefully I will come up with something tommorrow.  

     

    Thanks!


  • ok initial test with v3 editor and runtime, I can make outputs work.  

     

    I will test the v4 editor with v4 runtime hopefully later today.  


  • For some reason the editor is not assigning the pin outputs.  

     

    The first one is off V3 editor, the second off V4 editor.  I tried to add the pin assignments manually in that line of code on the V4 version and it came up with more errors.  My "TEST" variable only shows up the one time in the V4 code and never with any reference to what pin it would be attached to.  I have posted this over on the OpenPLC forum.  We will see!

     

    SM_16DIN0(STACK := SM_16IN_STK);
      HOBBY_LTS := SM_16DIN0.I1;
      TON0(IN := HOBBY_LTS, PT := DB);
      HOBBY_LT := TON0.Q;
      OFFICE_LTS := SM_16DIN0.I2;
      TON1(IN := OFFICE_LTS, PT := DB);
      OFFICE_LT := TON1.Q;
      SM_8RELAY0(STACK := SM_8RLY_STK, O1 := HOBBY_LT, O4 := TEST);
      SM_INDUSTRIAL0(STACK := SM_IND_STK, LED1 := OFFICE_LT);
    SM_16DIN0(STACK := SM_16DIN_STK);
      TON0(IN := SM_16DIN0.I1, PT := DB);
      SM_8RELAY0(STACK := SM_8RELAY_STK);
      SM_INDUSTRIAL0(STACK := SM_INDUSTRIAL_STK);
      HOBBY_LTS := SM_16DIN0.I1;
      OFFICE_LTS := SM_16DIN0.I2;
      TON1(IN := SM_16DIN0.I2, PT := DB);

Please login to reply to this topic!