568 s4o.indent_right(); |
568 s4o.indent_right(); |
569 vardecl = new generate_c_vardecl_c(&s4o, |
569 vardecl = new generate_c_vardecl_c(&s4o, |
570 generate_c_vardecl_c::finterface_vf, |
570 generate_c_vardecl_c::finterface_vf, |
571 generate_c_vardecl_c::input_vt | |
571 generate_c_vardecl_c::input_vt | |
572 generate_c_vardecl_c::output_vt | |
572 generate_c_vardecl_c::output_vt | |
573 generate_c_vardecl_c::inoutput_vt); |
573 generate_c_vardecl_c::inoutput_vt | |
|
574 generate_c_vardecl_c::eneno_vt); |
|
575 vardecl->print(symbol->var_declarations_list); |
|
576 if (!vardecl->is_en_declared()) { |
|
577 s4o.print(",\n" + s4o.indent_spaces + "BOOL EN"); |
|
578 } |
|
579 if (!vardecl->is_eno_declared()) { |
|
580 s4o.print(",\n" + s4o.indent_spaces + "BOOL *ENO"); |
|
581 } |
|
582 delete vardecl; |
|
583 |
|
584 s4o.indent_left(); |
|
585 |
|
586 s4o.print(")\n" + s4o.indent_spaces + "{\n"); |
|
587 |
|
588 /* (B) Function local variable declaration */ |
|
589 /* (B.1) Variables declared in ST source code */ |
|
590 s4o.indent_right(); |
|
591 |
|
592 vardecl = new generate_c_vardecl_c(&s4o, |
|
593 generate_c_vardecl_c::localinit_vf, |
|
594 generate_c_vardecl_c::output_vt | |
|
595 generate_c_vardecl_c::inoutput_vt | |
|
596 generate_c_vardecl_c::private_vt); |
574 vardecl->print(symbol->var_declarations_list); |
597 vardecl->print(symbol->var_declarations_list); |
575 delete vardecl; |
598 delete vardecl; |
576 s4o.indent_left(); |
599 |
577 |
600 /* (B.2) Temporary variable for function's return value */ |
578 s4o.print(")\n" + s4o.indent_spaces + "{\n"); |
|
579 |
|
580 /* (B) Function local variable declaration */ |
|
581 /* (B.1) Variables declared in ST source code */ |
|
582 s4o.indent_right(); |
|
583 vardecl = new generate_c_vardecl_c(&s4o, |
|
584 generate_c_vardecl_c::foutputdecl_vf, |
|
585 generate_c_vardecl_c::output_vt | |
|
586 generate_c_vardecl_c::inoutput_vt); |
|
587 vardecl->print(symbol->var_declarations_list); |
|
588 delete vardecl; |
|
589 |
|
590 vardecl = new generate_c_vardecl_c(&s4o, generate_c_vardecl_c::localinit_vf, generate_c_vardecl_c::private_vt); |
|
591 vardecl->print(symbol->var_declarations_list); |
|
592 delete vardecl; |
|
593 |
|
594 /* (B.2) Temporary variable for function's return value */ |
|
595 /* It will have the same name as the function itself! */ |
601 /* It will have the same name as the function itself! */ |
596 s4o.print(s4o.indent_spaces); |
602 s4o.print(s4o.indent_spaces); |
597 symbol->type_name->accept(*this); /* return type */ |
603 symbol->type_name->accept(*this); /* return type */ |
598 s4o.print(" "); |
604 s4o.print(" "); |
599 symbol->derived_function_name->accept(*this); |
605 symbol->derived_function_name->accept(*this); |
603 symbol_c *default_value = (symbol_c *)symbol->type_name->accept(*type_initial_value_c::instance()); |
609 symbol_c *default_value = (symbol_c *)symbol->type_name->accept(*type_initial_value_c::instance()); |
604 if (default_value == NULL) ERROR; |
610 if (default_value == NULL) ERROR; |
605 default_value->accept(*this); |
611 default_value->accept(*this); |
606 } |
612 } |
607 s4o.print(";\n\n"); |
613 s4o.print(";\n\n"); |
608 |
614 |
|
615 s4o.print(s4o.indent_spaces + "// Control execution\n"); |
|
616 s4o.print(s4o.indent_spaces + "if (!EN) {\n"); |
|
617 s4o.indent_right(); |
|
618 s4o.print(s4o.indent_spaces + "if (ENO != NULL) {\n"); |
|
619 s4o.indent_right(); |
|
620 s4o.print(s4o.indent_spaces + "*ENO = __BOOL_LITERAL(FALSE);\n"); |
|
621 s4o.indent_left(); |
|
622 s4o.print(s4o.indent_spaces + "}\n"); |
|
623 s4o.print(s4o.indent_spaces + "return "); |
|
624 symbol->derived_function_name->accept(*this); |
|
625 s4o.print(";\n"); |
|
626 s4o.indent_left(); |
|
627 s4o.print(s4o.indent_spaces + "}\n"); |
|
628 s4o.print(s4o.indent_spaces + "else {\n"); |
|
629 s4o.indent_right(); |
|
630 s4o.print(s4o.indent_spaces + "if (ENO != NULL) {\n"); |
|
631 s4o.indent_right(); |
|
632 s4o.print(s4o.indent_spaces + "*ENO = __BOOL_LITERAL(TRUE);\n"); |
|
633 s4o.indent_left(); |
|
634 s4o.print(s4o.indent_spaces + "}\n"); |
|
635 s4o.indent_left(); |
|
636 s4o.print(s4o.indent_spaces + "}\n"); |
|
637 |
609 /* (C) Function body */ |
638 /* (C) Function body */ |
610 generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol); |
639 generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol); |
611 symbol->function_body->accept(generate_c_code); |
640 symbol->function_body->accept(generate_c_code); |
612 |
641 |
613 vardecl = new generate_c_vardecl_c(&s4o, |
642 vardecl = new generate_c_vardecl_c(&s4o, |
661 s4o_incl.print(s4o_incl.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n"); |
690 s4o_incl.print(s4o_incl.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n"); |
662 vardecl = new generate_c_vardecl_c(&s4o_incl, |
691 vardecl = new generate_c_vardecl_c(&s4o_incl, |
663 generate_c_vardecl_c::local_vf, |
692 generate_c_vardecl_c::local_vf, |
664 generate_c_vardecl_c::input_vt | |
693 generate_c_vardecl_c::input_vt | |
665 generate_c_vardecl_c::output_vt | |
694 generate_c_vardecl_c::output_vt | |
666 generate_c_vardecl_c::inoutput_vt); |
695 generate_c_vardecl_c::inoutput_vt | |
|
696 generate_c_vardecl_c::eneno_vt); |
667 vardecl->print(symbol->var_declarations); |
697 vardecl->print(symbol->var_declarations); |
|
698 if (!vardecl->is_en_declared()) { |
|
699 s4o_incl.print(s4o_incl.indent_spaces + "BOOL EN;\n"); |
|
700 } |
|
701 if (!vardecl->is_eno_declared()) { |
|
702 s4o_incl.print(s4o_incl.indent_spaces + "BOOL ENO;\n"); |
|
703 } |
668 delete vardecl; |
704 delete vardecl; |
669 s4o_incl.print("\n"); |
705 s4o_incl.print("\n"); |
670 /* (A.3) Private internal variables */ |
706 /* (A.3) Private internal variables */ |
671 s4o_incl.print(s4o_incl.indent_spaces + "// FB private variables - TEMP, private and located variables\n"); |
707 s4o_incl.print(s4o_incl.indent_spaces + "// FB private variables - TEMP, private and located variables\n"); |
672 vardecl = new generate_c_vardecl_c(&s4o_incl, |
708 vardecl = new generate_c_vardecl_c(&s4o_incl, |
675 generate_c_vardecl_c::private_vt | |
711 generate_c_vardecl_c::private_vt | |
676 generate_c_vardecl_c::located_vt | |
712 generate_c_vardecl_c::located_vt | |
677 generate_c_vardecl_c::external_vt); |
713 generate_c_vardecl_c::external_vt); |
678 vardecl->print(symbol->var_declarations); |
714 vardecl->print(symbol->var_declarations); |
679 delete vardecl; |
715 delete vardecl; |
|
716 |
680 /* (A.4) Generate private internal variables for SFC */ |
717 /* (A.4) Generate private internal variables for SFC */ |
681 sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd); |
718 sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd); |
682 sfcdecl->print(symbol->fblock_body); |
719 sfcdecl->print(symbol->fblock_body); |
683 delete sfcdecl; |
720 delete sfcdecl; |
684 s4o_incl.print("\n"); |
721 s4o_incl.print("\n"); |
711 generate_c_vardecl_c::input_vt | |
748 generate_c_vardecl_c::input_vt | |
712 generate_c_vardecl_c::output_vt | |
749 generate_c_vardecl_c::output_vt | |
713 generate_c_vardecl_c::inoutput_vt | |
750 generate_c_vardecl_c::inoutput_vt | |
714 generate_c_vardecl_c::private_vt | |
751 generate_c_vardecl_c::private_vt | |
715 generate_c_vardecl_c::located_vt | |
752 generate_c_vardecl_c::located_vt | |
716 generate_c_vardecl_c::external_vt); |
753 generate_c_vardecl_c::external_vt | |
|
754 generate_c_vardecl_c::eneno_vt); |
717 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
755 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
|
756 if (!vardecl->is_en_declared()) { |
|
757 s4o.print("\n" + s4o.indent_spaces); |
|
758 s4o.print(FB_FUNCTION_PARAM); |
|
759 s4o.print("->EN = __BOOL_LITERAL(TRUE);"); |
|
760 } |
|
761 if (!vardecl->is_eno_declared()) { |
|
762 s4o.print("\n" + s4o.indent_spaces); |
|
763 s4o.print(FB_FUNCTION_PARAM); |
|
764 s4o.print("->ENO = __BOOL_LITERAL(TRUE);"); |
|
765 } |
718 delete vardecl; |
766 delete vardecl; |
719 s4o.print("\n"); |
767 s4o.print("\n"); |
720 /* (B.3) Generate private internal variables for SFC */ |
768 /* (B.3) Generate private internal variables for SFC */ |
721 sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcinit_sd); |
769 sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcinit_sd); |
722 sfcdecl->print(symbol->fblock_body, FB_FUNCTION_PARAM"->"); |
770 sfcdecl->print(symbol->fblock_body, FB_FUNCTION_PARAM"->"); |
747 symbol->fblock_name->accept(*this); |
795 symbol->fblock_name->accept(*this); |
748 s4o.print(" *"); |
796 s4o.print(" *"); |
749 s4o.print(FB_FUNCTION_PARAM); |
797 s4o.print(FB_FUNCTION_PARAM); |
750 s4o.print(") {\n"); |
798 s4o.print(") {\n"); |
751 s4o.indent_right(); |
799 s4o.indent_right(); |
|
800 |
|
801 s4o.print(s4o.indent_spaces + "// Control execution\n"); |
|
802 s4o.print(s4o.indent_spaces + "if (!"); |
|
803 s4o.print(FB_FUNCTION_PARAM); |
|
804 s4o.print("->EN) {\n"); |
|
805 s4o.indent_right(); |
|
806 s4o.print(s4o.indent_spaces); |
|
807 s4o.print(FB_FUNCTION_PARAM); |
|
808 s4o.print("->ENO = __BOOL_LITERAL(FALSE);\n"); |
|
809 s4o.print(s4o.indent_spaces + "return;\n"); |
|
810 s4o.indent_left(); |
|
811 s4o.print(s4o.indent_spaces + "}\n"); |
|
812 s4o.print(s4o.indent_spaces + "else {\n"); |
|
813 s4o.indent_right(); |
|
814 s4o.print(s4o.indent_spaces); |
|
815 s4o.print(FB_FUNCTION_PARAM); |
|
816 s4o.print("->ENO = __BOOL_LITERAL(TRUE);\n"); |
|
817 s4o.indent_left(); |
|
818 s4o.print(s4o.indent_spaces + "}\n"); |
752 |
819 |
753 /* (C.4) Initialize TEMP variables */ |
820 /* (C.4) Initialize TEMP variables */ |
754 /* function body */ |
821 /* function body */ |
755 s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
822 s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
756 vardecl = new generate_c_vardecl_c(&s4o, |
823 vardecl = new generate_c_vardecl_c(&s4o, |