Device Communications Subroutines in the Enabler Sample

The CIMPLICITY Device Communications Toolkit API provides a customizable interface between CIMPLICITY software and device communications.

Following is a sample of how the user-customized subroutines fit into the overall execution of the enabler.

The order provided here represents a very high-level description of operation and includes only those details believed relevant to customizing an enabler.

INITIALIZATION
Setup internal data structures
  READ process configuration data for enabler
  READ port configuration data for enabler
  CALL user_init()
  ...
  CALL user_open_port()
  CALL user_protocol_info();
  ...
  FOREACH CIMPLICITY DEVICE related to this ENABLER
     READ CIMPLICITY configuration data for device
    IF supported.use_default_domain_count == TOOLKIT_NO
        CALL user_device_set_max_device_domain_count()
     ENDIF
   CALL user_device_info()
     READ point configuration data for device
     IF supported.model_req == TOOLKIT_YES
       CALL user_cpu_model()
     ENDIF
     FOREACH DEVICE_POINT
       CALL user_valid_point()
       IF problem with device or point and point was validated
         CALL user_remove_point()
       ENDIF
     ENDFOR
     IF supported.det_dev_status == TOOLKIT_YES
       CALL user_device_okay()
     ENDIF
  ENDFOR
  ...
  COMPLETE INITIALIZATION BY ESTABLISHING COMMUNICATIONS
  WITH INTERESTED CIMPLICITY SUBSYSTEMS
  ...
  WHEN
     UNSOLICITED_DATA_RECEIVED:
        IF support.unsolic_req == TOOLKIT_YES
           IF user_accept_unsolicited_data() returns TRUE
              CALL user_process_unsolicited_data()
           ENDIF
        ENDIF
     TIME_TO_SCAN_POINT_VALUES:
        IF support.read_req == TOOLKIT_YES
           SETUP parameters for read
           CALL user_read_data()
           CALL user_cvt_data_from_device()
        ENDIF
     SET_POINT:
        IF support.write_req == TOOLKIT_YES
           SETUP parameters for write
           CALL user_cvt_data_to_device()
           CALL user_write_data()
        ENDIF
     WRITE_POINT_QUALITY:
        IF support.unsolicited_quality_data == TOOLKIT_YES
           IF supported.extended_user_bits == TOOLKIT_YES
               CALL user_write_point_quality2()
           ELSE
              CALL user_write_point_quality()
           ENDIF
        ENDIF
     DEMAND_STATUS_UPDATE:
        IF (point is no longer in demand)
           CALL user_on_demand_response()
        ELSE
           CALL user_on_demand_response()
        ENDIF
     TIME_TO_RETRY_FAILED_DEVICES:
        FOREACH uninitialized device
          IF supported.use_default_domain_count == TOOLKIT_NO
              CALL user_device_set_max_device_domain_count()
           CALL user_device_info()
           IF supported.model_req == TOOLKIT_YES
              CALL user_cpu_model()
           ENDIF
           FOREACH DEVICE_POINT
              CALL user_valid_point()
           ENDFOR
           IF supported.det_dev_status == TOOLKIT_YES
              CALL user_device_okay()
           ENDIF
        ENDFOR
     NEW_POINT_DYNAMICALLY_CONFIGURED:
        IF existing point
           CALL user_remove_point()
        CALL user_valid_point()
        If not found valid
           CALL user_remove_point()
        IF poll-once point
           CALL user_read_data()
     CHECK_DEVICE_STATUS:
        IF ((support.host_redundancy == TOOLKIT_YES) &&
           (currently secondary node))
           CALL user_heartbeat_device
        ENDIF
     SHUTDOWN:
        Cleanup
        CALL user_term()
     USER_EVENT_1:
        CALL user_proc_event_1()
     USER_EVENT_2:
        CALL user_proc_event_2()
     USER_EVENT_3:
        CALL user_proc_event_3()
     USER_EVENT_4:
        CALL user_proc_event_4()
     USER_EVENT_5:
        CALL user_proc_event_5()
     USER_EVENT_6:
        CALL user_proc_event_6()
     USER_EVENT_7:
        CALL user_proc_event_7()
     USER_EVENT_8:
        CALL user_proc_event_8()
     USER_EVENT_9:
        CALL user_proc_event_9()
     USER_EVENT_10:
        CALL user_proc_event_10()
  END WHEN