An example of usage of the X-NUCLEO-PLC01A1 Programmable Logic Controller Expansion Board.

Dependencies:   X_NUCLEO_PLC01A1

PLC with the X-NUCLEO-PLC01A1 Expansion Board

This application provides a simple example of usage of the X-NUCLEO-PLC01A1 Programmable Logic Controller Expansion Board.
It shows how to use one PLC connected to the board, driving the status of each output channels according to the status of each input channels.

Committer:
apalmieri
Date:
Mon Jul 12 14:19:31 2021 +0000
Revision:
7:b7f0a8b4bf19
Parent:
6:afd63b2b2d1a
Update example to be compliant with mbed-os 6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
apalmieri 0:4f51d6a15c93 1 /**
apalmieri 0:4f51d6a15c93 2 ******************************************************************************
apalmieri 0:4f51d6a15c93 3 * @file main.cpp
apalmieri 0:4f51d6a15c93 4 * @author AST/CLs
Davidroid 2:bf16a2ba8662 5 * @version V1.1.0
Davidroid 2:bf16a2ba8662 6 * @date February 23rd, 2016
apalmieri 0:4f51d6a15c93 7 * @brief mbed test application for the STMicroelectronics X-NUCLEO-PLC01A1
apalmieri 0:4f51d6a15c93 8 * PLC Expansion Board.
apalmieri 0:4f51d6a15c93 9 ******************************************************************************
apalmieri 0:4f51d6a15c93 10 * @attention
apalmieri 0:4f51d6a15c93 11 *
apalmieri 0:4f51d6a15c93 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
apalmieri 0:4f51d6a15c93 13 *
apalmieri 0:4f51d6a15c93 14 * Redistribution and use in source and binary forms, with or without modification,
apalmieri 0:4f51d6a15c93 15 * are permitted provided that the following conditions are met:
apalmieri 0:4f51d6a15c93 16 * 1. Redistributions of source code must retain the above copyright notice,
apalmieri 0:4f51d6a15c93 17 * this list of conditions and the following disclaimer.
apalmieri 0:4f51d6a15c93 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
apalmieri 0:4f51d6a15c93 19 * this list of conditions and the following disclaimer in the documentation
apalmieri 0:4f51d6a15c93 20 * and/or other materials provided with the distribution.
apalmieri 0:4f51d6a15c93 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
apalmieri 0:4f51d6a15c93 22 * may be used to endorse or promote products derived from this software
apalmieri 0:4f51d6a15c93 23 * without specific prior written permission.
apalmieri 0:4f51d6a15c93 24 *
apalmieri 0:4f51d6a15c93 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
apalmieri 0:4f51d6a15c93 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
apalmieri 0:4f51d6a15c93 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
apalmieri 0:4f51d6a15c93 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
apalmieri 0:4f51d6a15c93 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
apalmieri 0:4f51d6a15c93 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
apalmieri 0:4f51d6a15c93 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
apalmieri 0:4f51d6a15c93 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
apalmieri 0:4f51d6a15c93 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
apalmieri 0:4f51d6a15c93 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
apalmieri 0:4f51d6a15c93 35 *
apalmieri 0:4f51d6a15c93 36 ******************************************************************************
apalmieri 0:4f51d6a15c93 37 */
apalmieri 0:4f51d6a15c93 38
apalmieri 0:4f51d6a15c93 39
apalmieri 0:4f51d6a15c93 40 /* Includes ------------------------------------------------------------------*/
apalmieri 0:4f51d6a15c93 41
Davidroid 2:bf16a2ba8662 42 /* expansion board specific header files. */
Davidroid 6:afd63b2b2d1a 43 #include "XNucleoPLC01A1.h"
apalmieri 0:4f51d6a15c93 44
apalmieri 0:4f51d6a15c93 45
apalmieri 0:4f51d6a15c93 46 /* Definitions ---------------------------------------------------------------*/
Davidroid 2:bf16a2ba8662 47
apalmieri 0:4f51d6a15c93 48 /* Uncomment this for OUTPUT_CYCLING ENABLE */
apalmieri 4:17b45bcd5b40 49 //#define OUTPUT_CYCLING
apalmieri 0:4f51d6a15c93 50
Davidroid 2:bf16a2ba8662 51
apalmieri 0:4f51d6a15c93 52 /* Variables -----------------------------------------------------------------*/
apalmieri 0:4f51d6a15c93 53
apalmieri 0:4f51d6a15c93 54 /* Array for input data from Digital Input Termination Device */
Davidroid 6:afd63b2b2d1a 55 uint8_t input_array[2] = {0x00, 0x00};
apalmieri 0:4f51d6a15c93 56 /* Array for output data to Solid State Relay */
Davidroid 6:afd63b2b2d1a 57 uint8_t output_array[2] = {0x00, 0x00};
apalmieri 0:4f51d6a15c93 58
apalmieri 0:4f51d6a15c93 59 /* Number of channels in ON state */
Davidroid 6:afd63b2b2d1a 60 uint8_t ch_on = 0x00;
apalmieri 0:4f51d6a15c93 61
apalmieri 0:4f51d6a15c93 62
apalmieri 0:4f51d6a15c93 63 /* Functions -----------------------------------------------------------------*/
apalmieri 0:4f51d6a15c93 64
apalmieri 0:4f51d6a15c93 65 /**
apalmieri 0:4f51d6a15c93 66 * @brief Receive input data from Digital Input Termination Device
apalmieri 0:4f51d6a15c93 67 * @param None
apalmieri 0:4f51d6a15c93 68 * @retval None
apalmieri 0:4f51d6a15c93 69 */
Davidroid 6:afd63b2b2d1a 70 void digital_input_array_handler(XNucleoPLC01A1 &plc)
apalmieri 0:4f51d6a15c93 71 {
Davidroid 6:afd63b2b2d1a 72 plc.plc_input().dig_inp_array_get_input(input_array);
apalmieri 0:4f51d6a15c93 73 }
apalmieri 0:4f51d6a15c93 74
apalmieri 0:4f51d6a15c93 75 /**
apalmieri 0:4f51d6a15c93 76 * @brief Select output function and set outputs
apalmieri 0:4f51d6a15c93 77 * @param None
apalmieri 0:4f51d6a15c93 78 * @retval None
apalmieri 0:4f51d6a15c93 79 */
Davidroid 6:afd63b2b2d1a 80 void ssrelay_handler(XNucleoPLC01A1 &plc)
apalmieri 0:4f51d6a15c93 81 {
Davidroid 6:afd63b2b2d1a 82 /* Set output_array as DigInpArray RxBuffer */
Davidroid 6:afd63b2b2d1a 83 output_array[1] = plc.signal_mirror(input_array[1]);
apalmieri 0:4f51d6a15c93 84
apalmieri 0:4f51d6a15c93 85 /* Uncomment the relevant function as required */
Davidroid 6:afd63b2b2d1a 86 //output_array[1] = plc.signal_mirror(0xFF);
Davidroid 6:afd63b2b2d1a 87 //output_array[1] = plc.output_freeze(0xFF,5000);
Davidroid 6:afd63b2b2d1a 88 //output_array[1] = plc.output_regroup(0xFF);
Davidroid 6:afd63b2b2d1a 89 //ch_on = plc.input_sum(&output_array[1],0xFF);
Davidroid 6:afd63b2b2d1a 90 //output_array[1] = plc.set_output(0xFF);
Davidroid 6:afd63b2b2d1a 91 //output_array[1] = plc.inputs_and(0xFF,0x0F);
Davidroid 6:afd63b2b2d1a 92 //output_array[1] = plc.inputs_or(0xF0,0x0F);
Davidroid 6:afd63b2b2d1a 93 //output_array[1] = plc.inputs_not(0x00);
Davidroid 6:afd63b2b2d1a 94 //output_array[1] = plc.inputs_xor(0xFF,0x00);
apalmieri 0:4f51d6a15c93 95
apalmieri 0:4f51d6a15c93 96 /* Parity bits calculation */
Davidroid 6:afd63b2b2d1a 97 plc.output_parity_bits(output_array);
apalmieri 0:4f51d6a15c93 98
apalmieri 0:4f51d6a15c93 99 /* Send output information to solid state relay */
Davidroid 6:afd63b2b2d1a 100 plc.plc_output().ssrelay_set_output(output_array);
apalmieri 0:4f51d6a15c93 101 }
apalmieri 0:4f51d6a15c93 102
apalmieri 0:4f51d6a15c93 103 void setup(SPI &spi, int bits, int mode = 0, int frequency_hz = 1E6)
apalmieri 0:4f51d6a15c93 104 {
apalmieri 0:4f51d6a15c93 105 /* Set given configuration. */
apalmieri 0:4f51d6a15c93 106 spi.format(bits, mode);
apalmieri 0:4f51d6a15c93 107 spi.frequency(frequency_hz);
apalmieri 0:4f51d6a15c93 108 }
apalmieri 0:4f51d6a15c93 109
Davidroid 2:bf16a2ba8662 110
apalmieri 0:4f51d6a15c93 111 /* Main ----------------------------------------------------------------------*/
apalmieri 0:4f51d6a15c93 112
apalmieri 0:4f51d6a15c93 113 int main()
apalmieri 0:4f51d6a15c93 114 {
apalmieri 0:4f51d6a15c93 115 /*----- Initialization. -----*/
Davidroid 6:afd63b2b2d1a 116
Davidroid 6:afd63b2b2d1a 117 /* Printing to the console. */
Davidroid 6:afd63b2b2d1a 118 printf("PLC Control Application Example\r\n\n");
apalmieri 0:4f51d6a15c93 119
apalmieri 0:4f51d6a15c93 120 /* Initializing SPI bus. */
apalmieri 4:17b45bcd5b40 121 SPI spi(X_NUCLEO_PLC01A1_PIN_SPI_MOSI, X_NUCLEO_PLC01A1_PIN_SPI_MISO, X_NUCLEO_PLC01A1_PIN_SPI_SCLK);
apalmieri 4:17b45bcd5b40 122 setup(spi, X_NUCLEO_PLC01A1_PIN_SPI_BITS);
apalmieri 0:4f51d6a15c93 123
apalmieri 5:321e4e37ba1c 124 /* Initializing X_NUCLEO_PLC01A1 IO Channels Component. */
Davidroid 6:afd63b2b2d1a 125 XNucleoPLC01A1 plc(X_NUCLEO_PLC01A1_PIN_SPI_CS1, X_NUCLEO_PLC01A1_PIN_SPI_CS2, X_NUCLEO_PLC01A1_PIN_OUT_EN, spi);
apalmieri 0:4f51d6a15c93 126
apalmieri 0:4f51d6a15c93 127 while(1) {
Davidroid 6:afd63b2b2d1a 128 plc.plc_input().set_read_status(1);
apalmieri 0:4f51d6a15c93 129 /* Polling input device to refresh input state */
Davidroid 6:afd63b2b2d1a 130 if(plc.plc_input().get_read_status()) {
apalmieri 0:4f51d6a15c93 131
Davidroid 6:afd63b2b2d1a 132 plc.plc_input().set_read_status(0);
apalmieri 0:4f51d6a15c93 133
apalmieri 0:4f51d6a15c93 134 #ifdef OUTPUT_CYCLING
Davidroid 6:afd63b2b2d1a 135 plc.output_cycling();
apalmieri 0:4f51d6a15c93 136 #else
Davidroid 6:afd63b2b2d1a 137 digital_input_array_handler(plc);
Davidroid 6:afd63b2b2d1a 138 ssrelay_handler(plc);
apalmieri 0:4f51d6a15c93 139 #endif /* OUTPUT_CYCLING */
apalmieri 0:4f51d6a15c93 140 }
apalmieri 7:b7f0a8b4bf19 141 ThisThread::sleep_for(chrono::milliseconds(10));
apalmieri 0:4f51d6a15c93 142 }
apalmieri 0:4f51d6a15c93 143 }