Skip to content

Commit 9e61b08

Browse files
committed
Add check program valid function
1 parent b9fec05 commit 9e61b08

File tree

6 files changed

+163
-4
lines changed

6 files changed

+163
-4
lines changed

ladder_networks.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@
584584
{
585585
"name": "value1",
586586
"type": "I",
587-
"value": "0.4"
587+
"value": "0.7"
588588
}
589589
]
590590
},

test/ladderlib_test.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "ladder_instructions.h"
4040
#include "fn_dummy.h"
4141
#include "ladder_program_json.h"
42+
#include "ladder_program_check.h"
4243

4344
// registers quantity
4445
#define QTY_M 8
@@ -114,6 +115,11 @@ int main(void) {
114115

115116
printf("\n");
116117

118+
if((err = ladder_program_check(ladder_ctx)) != LADDER_ERR_PRG_CHECK_OK) {
119+
printf("ERROR: Program not valid (%d)\n", err);
120+
goto end;
121+
}
122+
117123
ladder_print(ladder_ctx);
118124

119125
printf("Start Task Ladder\n\n");

utils/ladder_print.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* @fn void ladder_print(ladder_ctx_t *ladder_ctx)
4343
* @brief Print networks in ascii graphical format
4444
*
45-
* @param ladder_ctx
45+
* @param ladder_ctx Ladder context
4646
*/
4747
void ladder_print(ladder_ctx_t ladder_ctx);
4848

utils/ladder_program_check.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Copyright 2025 Emiliano Gonzalez (egonzalez . hiperion @ gmail . com))
3+
* * Project Site: https://github.com/hiperiondev/ladderlib *
4+
*
5+
* This is based on other projects:
6+
* PLsi (https://github.com/ElPercha/PLsi)
7+
*
8+
* please contact their authors for more information.
9+
*
10+
* The MIT License (MIT)
11+
*
12+
* Permission is hereby granted, free of charge, to any person obtaining
13+
* a copy of this software and associated documentation files (the
14+
* "Software"), to deal in the Software without restriction, including
15+
* without limitation the rights to use, copy, modify, merge, publish,
16+
* distribute, sublicense, and/or sell copies of the Software, and to
17+
* permit persons to whom the Software is furnished to do so, subject to
18+
* the following conditions:
19+
*
20+
* The above copyright notice and this permission notice shall be
21+
* included in all copies or substantial portions of the Software.
22+
*
23+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30+
*
31+
*/
32+
33+
#include "ladder.h"
34+
#include "ladder_internals.h"
35+
#include "ladder_program_check.h"
36+
37+
ladder_err_prg_check_t ladder_program_check(ladder_ctx_t ladder_ctx) {
38+
for (uint32_t nt = 0; nt < ladder_ctx.ladder.quantity.networks; nt++)
39+
for (uint32_t column = 0; column < ladder_ctx.network[nt].cols; column++)
40+
for (uint32_t row = 0; row < ladder_ctx.network[nt].rows; row++)
41+
for (uint32_t d = 0; d < ladder_ctx.network[nt].cells[row][column].data_qty; d++) {
42+
switch (ladder_ctx.network[nt].cells[row][column].data[d].type) {
43+
case LADDER_TYPE_Q:
44+
if (ladder_ctx.hw.io.fn_read_qty == 0)
45+
return LADDER_ERR_PRG_CHECK_NO_OUTPUT_MODULES;
46+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module > ladder_ctx.hw.io.fn_read_qty)
47+
return LADDER_ERR_PRG_CHECK_Q_INV_MODULE;
48+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.port
49+
> ladder_ctx.output[ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module].q_qty - 1)
50+
return LADDER_ERR_PRG_CHECK_Q_INV_PORT;
51+
break;
52+
case LADDER_TYPE_QW:
53+
if (ladder_ctx.hw.io.fn_write_qty == 0)
54+
return LADDER_ERR_PRG_CHECK_NO_OUTPUT_MODULES;
55+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module > ladder_ctx.hw.io.fn_read_qty)
56+
return LADDER_ERR_PRG_CHECK_QW_INV_MODULE;
57+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.port
58+
> ladder_ctx.output[ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module].qw_qty - 1)
59+
return LADDER_ERR_PRG_CHECK_QW_INV_PORT;
60+
break;
61+
case LADDER_TYPE_I:
62+
if (ladder_ctx.hw.io.fn_read_qty == 0)
63+
return LADDER_ERR_PRG_CHECK_NO_INPUT_MODULES;
64+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module > ladder_ctx.hw.io.fn_read_qty)
65+
return LADDER_ERR_PRG_CHECK_I_INV_MODULE;
66+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.port
67+
> ladder_ctx.input[ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module].i_qty - 1)
68+
return LADDER_ERR_PRG_CHECK_I_INV_PORT;
69+
break;
70+
case LADDER_TYPE_IW:
71+
if (ladder_ctx.hw.io.fn_write_qty == 0)
72+
return LADDER_ERR_PRG_CHECK_NO_INPUT_MODULES;
73+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module > ladder_ctx.hw.io.fn_read_qty)
74+
return LADDER_ERR_PRG_CHECK_I_INV_MODULE;
75+
if (ladder_ctx.network[nt].cells[row][column].data[d].value.mp.port
76+
> ladder_ctx.input[ladder_ctx.network[nt].cells[row][column].data[d].value.mp.module].iw_qty - 1)
77+
return LADDER_ERR_PRG_CHECK_I_INV_PORT;
78+
break;
79+
default:
80+
}
81+
}
82+
83+
return LADDER_ERR_PRG_CHECK_OK;
84+
}

utils/ladder_program_check.h

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright 2025 Emiliano Gonzalez (egonzalez . hiperion @ gmail . com))
3+
* * Project Site: https://github.com/hiperiondev/ladderlib *
4+
*
5+
* This is based on other projects:
6+
* PLsi (https://github.com/ElPercha/PLsi)
7+
*
8+
* please contact their authors for more information.
9+
*
10+
* The MIT License (MIT)
11+
*
12+
* Permission is hereby granted, free of charge, to any person obtaining
13+
* a copy of this software and associated documentation files (the
14+
* "Software"), to deal in the Software without restriction, including
15+
* without limitation the rights to use, copy, modify, merge, publish,
16+
* distribute, sublicense, and/or sell copies of the Software, and to
17+
* permit persons to whom the Software is furnished to do so, subject to
18+
* the following conditions:
19+
*
20+
* The above copyright notice and this permission notice shall be
21+
* included in all copies or substantial portions of the Software.
22+
*
23+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30+
*
31+
*/
32+
33+
#ifndef LADDER_PROGRAM_CHECK_H_
34+
#define LADDER_PROGRAM_CHECK_H_
35+
36+
#include "ladder.h"
37+
#include "ladder_internals.h"
38+
39+
/**
40+
* @enum LADDER_ERR_PRG_CHECK
41+
* @brief Ladder program check errors
42+
*
43+
*/
44+
typedef enum LADDER_ERR_PRG_CHECK {
45+
LADDER_ERR_PRG_CHECK_OK, //
46+
LADDER_ERR_PRG_CHECK_I_INV_MODULE, //
47+
LADDER_ERR_PRG_CHECK_I_INV_PORT, //
48+
LADDER_ERR_PRG_CHECK_Q_INV_MODULE, //
49+
LADDER_ERR_PRG_CHECK_Q_INV_PORT, //
50+
LADDER_ERR_PRG_CHECK_IW_INV_MODULE, //
51+
LADDER_ERR_PRG_CHECK_IW_INV_PORT, //
52+
LADDER_ERR_PRG_CHECK_QW_INV_MODULE, //
53+
LADDER_ERR_PRG_CHECK_QW_INV_PORT, //
54+
LADDER_ERR_PRG_CHECK_NO_INPUT_MODULES, //
55+
LADDER_ERR_PRG_CHECK_NO_OUTPUT_MODULES, //
56+
//////////////////////////////////////////
57+
LADDER_ERR_PRG_CHECK_FAIL //
58+
} ladder_err_prg_check_t;
59+
60+
/**
61+
* @fn ladder_err_prg_check_t ladder_program_check(ladder_ctx_t*)
62+
* @brief Check if program is valid
63+
*
64+
* @param ladder_ctx Ladder context
65+
* @return
66+
*/
67+
ladder_err_prg_check_t ladder_program_check(ladder_ctx_t ladder_ctx);
68+
69+
#endif /* LADDER_PROGRAM_CHECK_H_ */

utils/ladder_program_json.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ typedef enum JSON_ERROR {
6464
* @brief
6565
*
6666
* @param prg prg file name of JSON program
67-
* @param ladder_ctx
67+
* @param ladder_ctx Ladder context
6868
* @return Status
6969
*/
7070
ladder_json_error_t ladder_json_to_program(const char *prg, ladder_ctx_t *ladder_ctx);
@@ -74,7 +74,7 @@ ladder_json_error_t ladder_json_to_program(const char *prg, ladder_ctx_t *ladder
7474
* @brief
7575
*
7676
* @param prg prg file name of JSON program
77-
* @param ladder_ctx
77+
* @param ladder_ctx Ladder context
7878
* @return Status
7979
*/
8080
ladder_json_error_t ladder_program_to_json(const char *prg, ladder_ctx_t *ladder_ctx);

0 commit comments

Comments
 (0)