diff -r c1cf7259160d -r 8c3e91c385f5 stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Sat May 31 12:49:43 2014 +0100 +++ b/stage4/generate_c/generate_c_st.cc Sat May 31 16:22:57 2014 +0100 @@ -211,8 +211,7 @@ symbol->accept(*this); s4o.print(","); s4o.print(","); - } - else { + } else { print_variable_prefix(); s4o.print(","); wanted_variablegeneration = complextype_base_vg; @@ -334,7 +333,19 @@ switch (wanted_variablegeneration) { case complextype_base_vg: symbol->record_variable->accept(*this); - if ( get_datatype_info_c::is_function_block(symbol->record_variable->datatype)) { + /* NOTE: The following test includes a special case for SFC Steps. They are currently mapped onto a C data structure + * that does not follow the standard IEC_ pattern used for user defined structure datatypes + * (i.e. it does not include the 'values' and 'flag' structure + * elements that are tested by __GET_VAR and __SET_VAR acessor macros defined in acessor.h). However, the + * STEP.T and STEP.X elements of this step structure are of the IEC_BOOL and IEC_TIME datatypes, and are + * actually structures that do have the 'value' and 'flags' elements. So, it is safe to say that any variable + * that is a STEPname is not of a complex type, as its .T and .X elements are and can later be safely accessed + * using the __SET_VAR and __GET_VAR macros. + * + * For the above reason, a STEP must be handled as a FB, i.e. it does NOT contain the 'flags' and 'value' elements! + */ + if ( get_datatype_info_c::is_function_block(symbol->record_variable->datatype) + || get_datatype_info_c::is_sfc_step (symbol->record_variable->datatype)) { if (NULL == symbol->record_variable->scope) ERROR; search_var_instance_decl_c search_var_instance_decl(symbol->record_variable->scope); if (search_var_instance_decl_c::external_vt == search_var_instance_decl.get_vartype(get_var_name_c::get_last_field(symbol->record_variable))) @@ -346,7 +357,9 @@ break; case complextype_suffix_vg: symbol->record_variable->accept(*this); - if (!get_datatype_info_c::is_function_block(symbol->record_variable->datatype)) { // if the record variable is not a FB, then it will certainly be a structure! + // the following condition MUST be a negation of the above condition used in the 'case complextype_base_vg:' + if (!( get_datatype_info_c::is_function_block(symbol->record_variable->datatype) // if the record variable is not a FB... + || get_datatype_info_c::is_sfc_step (symbol->record_variable->datatype))) { // ...nor an SFC step name, then it will certainly be a structure! s4o.print("."); symbol->field_selector->accept(*this); }