Skip to content

Commit b9fec05

Browse files
committed
Change all I/Q values to module.port. Add modules dynamic load
1 parent aaf4087 commit b9fec05

12 files changed

Lines changed: 411 additions & 167 deletions

ladder.h

Lines changed: 99 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -251,19 +251,30 @@ typedef struct ladder_instructions_ioc_s {
251251

252252
extern 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
*/
259269
typedef 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 {
334341
typedef 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
*/
436441
typedef 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
*/
468475
typedef 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
*/
483488
typedef 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
*/
498501
typedef 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
*/
640668
void 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

ladder_networks.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@
198198
{
199199
"name": "value1",
200200
"type": "Q",
201-
"value": "0"
201+
"value": "0.0"
202202
}
203203
]
204204
}
@@ -211,7 +211,7 @@
211211
{
212212
"name": "value1",
213213
"type": "Q",
214-
"value": "0"
214+
"value": "0.0"
215215
}
216216
]
217217
},
@@ -487,7 +487,7 @@
487487
{
488488
"name": "value1",
489489
"type": "Q",
490-
"value": "1"
490+
"value": "0.1"
491491
}
492492
]
493493
}
@@ -500,7 +500,7 @@
500500
{
501501
"name": "value1",
502502
"type": "Q",
503-
"value": "1"
503+
"value": "0.1"
504504
}
505505
]
506506
},
@@ -584,7 +584,7 @@
584584
{
585585
"name": "value1",
586586
"type": "I",
587-
"value": "4"
587+
"value": "0.4"
588588
}
589589
]
590590
},
@@ -610,7 +610,7 @@
610610
{
611611
"name": "value1",
612612
"type": "Q",
613-
"value": "3"
613+
"value": "0.3"
614614
}
615615
]
616616
}
@@ -643,7 +643,7 @@
643643
{
644644
"name": "value1",
645645
"type": "Q",
646-
"value": "4"
646+
"value": "0.4"
647647
}
648648
]
649649
}
@@ -785,4 +785,4 @@
785785
]
786786
]
787787
}
788-
]
788+
]

0 commit comments

Comments
 (0)