@@ -251,19 +251,30 @@ typedef struct ladder_instructions_ioc_s {
251251
252252extern const ladder_instructions_iocd_t ladder_fn_iocd [];
253253
254+ /**
255+ * @struct ladder_moduleportvalue_s
256+ * @brief Module/Port value
257+ *
258+ */
259+ typedef struct ladder_moduleportvalue_s {
260+ uint8_t module ; /**< Module */
261+ uint8_t port ; /**< Port */
262+ } ladder_moduleportvalue_t ;
263+
254264/**
255265 * @struct ladder_value_s
256266 * @brief Value container
257267 *
258268 */
259269typedef struct ladder_value_s {
260- ladder_type_t type ; /**< Data type */
270+ ladder_type_t type ; /**< Data type */
261271 union {
262- uint32_t u32 ; /**< Unsigned integer */
263- int32_t i32 ; /**< Integer */
264- const char * cstr ; /**< Constant string */
265- float real ; /**< Real */
266- } value ; /**< Data */
272+ uint32_t u32 ; /**< Unsigned integer */
273+ int32_t i32 ; /**< Integer */
274+ const char * cstr ; /**< Constant string */
275+ float real ; /**< Real */
276+ ladder_moduleportvalue_t mp ; /**< module.port value */
277+ } value ; /**< Data */
267278} ladder_value_t ;
268279
269280/**
@@ -319,10 +330,6 @@ typedef struct ladder_s {
319330
320331 struct {
321332 uint32_t m ; /**< Quantity of regular flags */
322- uint32_t i ; /**< Quantity of digital inputs */
323- uint32_t q ; /**< Quantity of digital outputs */
324- uint32_t iw ; /**< Quantity of analog inputs */
325- uint32_t qw ; /**< Quantity of analog outputs */
326333 uint32_t c ; /**< Quantity of counters */
327334 uint32_t t ; /**< Quantity of timers */
328335 uint32_t d ; /**< Quantity of regular registers */
@@ -334,36 +341,34 @@ typedef struct ladder_s {
334341typedef struct ladder_ctx_s ladder_ctx_t ;
335342
336343/**
337- * @fn void (*_read_inputs_local )(ladder_ctx_t *ladder_ctx)
338- * @brief Read local hardware values
344+ * @fn void (*_io_read )(ladder_ctx_t *ladder_ctx, uint32_t id )
345+ * @brief Read hardware values
339346 *
340347 * @param ladder_ctx_t Ladder context
348+ * @param id Function id
341349 */
342- typedef void (* _read_inputs_local )(ladder_ctx_t * ladder_ctx );
350+ typedef void (* _io_read )(ladder_ctx_t * ladder_ctx , uint32_t id );
343351
344352/**
345- * @fn void (*_write_outputs_local )(ladder_ctx_t *ladder_ctx)
346- * @brief Write local hardware values
353+ * @fn void (*_io_write )(ladder_ctx_t *ladder_ctx, uint32_t id )
354+ * @brief Write hardware values
347355 *
348356 * @param ladder_ctx_t Ladder context
357+ * @param id Function id
349358 */
350- typedef void (* _write_outputs_local )(ladder_ctx_t * ladder_ctx );
359+ typedef void (* _io_write )(ladder_ctx_t * ladder_ctx , uint32_t id );
351360
352361/**
353- * @fn void (*_read_inputs_remote )(ladder_ctx_t * ladder_ctx)
354- * @brief Read remote hardware values
362+ * @fn bool (*_io_init )(ladder_ctx_t* ladder_ctx, uint32_t id, bool init_deinit )
363+ * @brief Initialize/deinitialize io function
355364 *
356- * @param ladder_ctx_t Ladder context
357- */
358- typedef void (* _read_inputs_remote )(ladder_ctx_t * ladder_ctx );
359-
360- /**
361- * @fn void (*_write_outputs_remote)(ladder_ctx_t *ladder_ctx
362- * @brief Write remote hardware values
365+ * @param ladder_ctx Ladder context
366+ * @param id Function id
367+ * @param init_deinit Initialize/deinitialize
363368 *
364- * @param ladder_ctx_t Ladder context
369+ * @return Status
365370 */
366- typedef void (* _write_outputs_remote )(ladder_ctx_t * ladder_ctx );
371+ typedef bool (* _io_init )(ladder_ctx_t * ladder_ctx , uint32_t id , bool init_deinit );
367372
368373/**
369374 * @fn bool (*_on_scan_end)(ladder_ctx_t *ladder_ctx)
@@ -435,10 +440,12 @@ typedef uint64_t (*_millis)(void);
435440 */
436441typedef struct ladder_hw_s {
437442 struct {
438- _read_inputs_local read_inputs_local ; /**< Read local hardware values */
439- _write_outputs_local write_outputs_local ; /**< Write local hardware values */
440- _read_inputs_remote read_inputs_remote ; /**< Read remote hardware values */
441- _write_outputs_remote write_outputs_remote ; /**< Write local hardware values */
443+ uint32_t fn_read_qty ; /**< Quantity of read functions */
444+ uint32_t fn_write_qty ; /**< Quantity of read functions */
445+ _io_read * read ; /**< Read hardware values */
446+ _io_write * write ; /**< Write hardware values */
447+ _io_init * init_read ; /**< Initialize read functions */
448+ _io_init * init_write ; /**< Initialize write functions */
442449 } io ;
443450
444451 struct {
@@ -467,8 +474,6 @@ typedef struct ladder_manage_s {
467474 */
468475typedef struct ladder_memory_s {
469476 uint8_t * M ; /**< Regular flags */
470- uint8_t * I ; /**< Digital Inputs */
471- uint8_t * Q ; /**< Digital Outputs */
472477 bool * Cr ; /**< Counter running */
473478 bool * Cd ; /**< Counter done */
474479 bool * Tr ; /**< Timer running */
@@ -482,8 +487,6 @@ typedef struct ladder_memory_s {
482487 */
483488typedef struct ladder_prev_scan_vals_s {
484489 uint8_t * Mh ; /**< Regular flags previous */
485- uint8_t * Ih ; /**< Digital Inputs previous */
486- uint8_t * Qh ; /**< Digital Outputs previous */
487490 bool * Crh ; /**< Counter running previous */
488491 bool * Cdh ; /**< Counter done previous */
489492 bool * Trh ; /**< Timer running previous */
@@ -496,13 +499,39 @@ typedef struct ladder_prev_scan_vals_s {
496499 *
497500 */
498501typedef struct ladder_registers_s {
499- int32_t * IW ; /**< Analog Inputs */
500- int32_t * QW ; /**< Analog Outputs */
501- uint32_t * C ; /**< Counter registers */
502- int32_t * D ; /**< Regular registers */
503- float * R ; /**< Floating point registers */
502+ uint32_t * C ; /**< Counter registers */
503+ int32_t * D ; /**< Regular registers */
504+ float * R ; /**< Floating point registers */
504505} ladder_registers_t ;
505506
507+ /**
508+ * @struct ladder_hw_input_vals_t
509+ * @brief Input scan values
510+ *
511+ */
512+ typedef struct ladder_hw_input_vals_s {
513+ uint32_t fn_id ; /**< Function id */
514+ uint32_t i_qty ; /**< Digital inputs quantity */
515+ uint32_t iw_qty ; /**< Analog inputs quantity */
516+ uint8_t * I ; /**< Digital inputs */
517+ int32_t * IW ; /**< Analog inputs */
518+ uint8_t * Ih ; /**< Digital inputs previous */
519+ } ladder_hw_input_vals_t ;
520+
521+ /**
522+ * @struct ladder_hw_output_vals_t
523+ * @brief Output scan values
524+ *
525+ */
526+ typedef struct ladder_hw_output_vals_s {
527+ uint32_t fn_id ; /**< Function id */
528+ uint32_t q_qty ; /**< Digital outputs quantity*/
529+ uint32_t qw_qty ; /**< Analog outputs quantity */
530+ uint8_t * Q ; /**< Digital outputs */
531+ int32_t * QW ; /**< Analog outputs */
532+ uint8_t * Qh ; /**< Digital outputs previous */
533+ } ladder_hw_output_vals_t ;
534+
506535/**
507536 * @struct plc_scan_internals_s
508537 * @brief Scan internals
@@ -581,6 +610,8 @@ typedef struct ladder_ctx_s {
581610 ladder_manage_t on ; /**< Manage functions */
582611 ladder_memory_t memory ; /**< Memory */
583612 ladder_prev_scan_vals_t prev_scan_vals ; /**< Previous scan values */
613+ ladder_hw_input_vals_t * input ; /**< Hw inputs */
614+ ladder_hw_output_vals_t * output ; /**< Hw outputs */
584615 ladder_registers_t registers ; /**< Registers */
585616 ladder_timer_t * timers ; /**< Timers */
586617 ladder_scan_internals_t scan_internals ; /**< Scan internals */
@@ -590,8 +621,8 @@ typedef struct ladder_ctx_s {
590621} ladder_ctx_t ;
591622
592623/**
593- * @fn bool ladder_ctx_init(ladder_ctx_t *ladder_ctx, uint8_t net_columns_qty, uint8_t net_rows_qty, uint32_t networks_qty, uint32_t qty_m, uint32_t qty_i ,
594- uint32_t qty_q, uint32_t qty_iw, uint32_t qty_qw, uint32_t qty_c, uint32_t qty_t, uint32_t qty_d, uint32_t qty_r, bool init_netwok);
624+ * @fn bool ladder_ctx_init(ladder_ctx_t *ladder_ctx, uint8_t net_columns_qty, uint8_t net_rows_qty, uint32_t networks_qty, uint32_t qty_m, uint32_t qty_c ,
625+ * uint32_t qty_t, uint32_t qty_d, uint32_t qty_r, bool init_netwok);
595626 * @brief Initialize context.
596627 *
597628 *
@@ -600,19 +631,16 @@ typedef struct ladder_ctx_s {
600631 * @param net_rows_qty Network Logic matrix rows size (Maximum: 32).
601632 * @param networks_qty Total Networks.
602633 * @param qty_m Memory Areas quantities. Marks. Regular flags.
603- * @param qty_i Memory Areas quantities. Digital Inputs.
604- * @param qty_q Memory Areas quantities. Digital Outputs.
605- * @param qty_iw Memory Areas quantities. Analog Inputs.
606- * @param qty_qw Memory Areas quantities. Analog Outputs.
607- * @param qty_c Memory Areas quantities. Counter registers (16 bits).
634+ * @param qty_c Memory Areas qu printf("ERROR Adding io read function\n");
635+ * antities. Counter registers (16 bits).
608636 * @param qty_t Memory Areas quantities. Timers.
609637 * @param qty_d Memory Areas quantities. Regular registers (16 bit signed).
610638 * @param qty_r Memory Areas quantities. Float or Real registers.
611639 * @param init_netwok If false not initialize Networks
612640 * @return Error
613641 */
614- bool ladder_ctx_init (ladder_ctx_t * ladder_ctx , uint8_t net_columns_qty , uint8_t net_rows_qty , uint32_t networks_qty , uint32_t qty_m , uint32_t qty_i ,
615- uint32_t qty_q , uint32_t qty_iw , uint32_t qty_qw , uint32_t qty_c , uint32_t qty_t , uint32_t qty_d , uint32_t qty_r , bool init_netwok );
642+ bool ladder_ctx_init (ladder_ctx_t * ladder_ctx , uint8_t net_columns_qty , uint8_t net_rows_qty , uint32_t networks_qty , uint32_t qty_m , uint32_t qty_c ,
643+ uint32_t qty_t , uint32_t qty_d , uint32_t qty_r , bool init_netwok );
616644
617645/**
618646 * @fn bool ladder_ctx_deinit(ladder_ctx_t *ladder_ctx)
@@ -639,6 +667,28 @@ void ladder_task(void *ladderctx);
639667 */
640668void ladder_clear_program (ladder_ctx_t * ladder_ctx );
641669
670+ /**
671+ * @fn bool ladder_add_read_fn(ladder_ctx_t*, _io_read read, _io_init read_init)
672+ * @brief Add read inputs function
673+ *
674+ * @param ladder_ctx Ladder context
675+ * @param read Read function
676+ * @param read_init Initialize/deinitialize read function
677+ * @return Status
678+ */
679+ bool ladder_add_read_fn (ladder_ctx_t * ladder_ctx , _io_read read , _io_init read_init );
680+
681+ /**
682+ * @fn bool ladder_add_write_fn(ladder_ctx_t*, _io_write write, _io_init write_init)
683+ * @brief Add write outputs function
684+ *
685+ * @param ladder_ctx Ladder context
686+ * @param write Write function
687+ * @param write Initialize/deinitialize write function
688+ * @return Status
689+ */
690+ bool ladder_add_write_fn (ladder_ctx_t * ladder_ctx , _io_write write , _io_init write_init );
691+
642692/**
643693 * @fn bool ladder_add_foreign(ladder_ctx_t *ladder_ctx, _foreign_fn_init fn_init, void *init_data, uint32_t qty)
644694 * @brief Add a foreign function
0 commit comments