PLC 16 in / 8 rev / an in-out / CAN

Dependencies:   PCAL955x mbed mbed-rtos AT45

Files at this revision

API Documentation at this revision

Comitter:
Oleg_B
Date:
Fri Feb 12 10:55:27 2021 +0000
Parent:
1:3768b56b12e7
Commit message:
files move to f

Changed in this revision

src/can.cpp Show diff for this revision Revisions of this file
src/can.h Show diff for this revision Revisions of this file
src/config_io.h Show diff for this revision Revisions of this file
src/f/can.cpp Show annotated file Show diff for this revision Revisions of this file
src/f/can.h Show annotated file Show diff for this revision Revisions of this file
src/f/config_io.h Show annotated file Show diff for this revision Revisions of this file
src/f/main.cpp Show annotated file Show diff for this revision Revisions of this file
src/f/set_vars.h Show annotated file Show diff for this revision Revisions of this file
src/f/task_ob.h Show annotated file Show diff for this revision Revisions of this file
src/f/task_pb1.h Show annotated file Show diff for this revision Revisions of this file
src/f/task_pb2.h Show annotated file Show diff for this revision Revisions of this file
src/f/task_pb3.h Show annotated file Show diff for this revision Revisions of this file
src/main.cpp Show diff for this revision Revisions of this file
src/set_vars.h Show diff for this revision Revisions of this file
src/task_ob.h Show diff for this revision Revisions of this file
src/task_pb1.h Show diff for this revision Revisions of this file
src/task_pb2.h Show diff for this revision Revisions of this file
src/task_pb3.h Show diff for this revision Revisions of this file
diff -r 3768b56b12e7 -r 439534d6bb89 src/can.cpp
--- a/src/can.cpp	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-
-#include <mbed.h>
-#include "rtos.h"
-#include "can.h"
-#include "ext_vars.h"
-
-
-//-------------хранение полученного  сообщения --------------
-//
-//                             [b1  b2  b3  b4]
-//                             -----------------
-// r_mess id[0] -> r_mess_data [ 0   1   2   3] - новое сообщение
-// r_mess id[1] -> r_mess_data [ 4   5   6   7]	- новое сообщение
-// r_mess id[2] -> r_mess_data [ 8   9  10  11]	- новое сообщение
-// r_mess id[3] -> r_mess_data [12  13  14  15]	- новое сообщение
-// r_mess id[4] -> r_mess_data [16  17  18  19]	- новое сообщение
-// r_mess id[5] -> r_mess_data [20  21  22  23]	- новое сообщение
-// r_mess id[6] -> r_mess_data [24  25  26  27]	- новое сообщение
-// r_mess id[7] -> r_mess_data [28  29  30  31]	- новое сообщение
-// r_mess id[8] -> r_mess_data [32  33  34  35]	- новое сообщение
-// r_mess id[9] -> r_mess_data [36  37  38  39]	- новое сообщение
-
-
-//--------- очередь сообщений на отправку ------------------
-//
-//                             [b1  b2  b3  b4]
-//                             -----------------
-// w_mess id[0] -> w_mess_data [ 0   1   2   3] - новое сообщение
-// w_mess id[1] -> w_mess_data [ 4   5   6   7]	- новое сообщение
-// w_mess id[2] -> w_mess_data [ 8   9  10  11]	- новое сообщение
-// w_mess id[3] -> w_mess_data [12  13  14  15]	- новое сообщение
-// w_mess id[4] -> w_mess_data [16  17  18  19]	- новое сообщение
-// w_mess id[5] -> w_mess_data [20  21  22  23]	- новое сообщение
-// w_mess id[6] -> w_mess_data [24  25  26  27]	- новое сообщение
-// w_mess id[7] -> w_mess_data [28  29  30  31]	- новое сообщение
-// w_mess id[8] -> w_mess_data [32  33  34  35]	- новое сообщение
-// w_mess id[9] -> w_mess_data [36  37  38  39]	- новое сообщение
-
-
-
-
-//  помещаем в очередь полученное сообщение 
-int  can_save_rd(int id, char b1, char b2, char b3, char b4)
-{
-	int res = 0 ; 
-	for(int i=0; i<9; i++){
-		if( r_mess_id[i]==0 && res==0){
-			r_mess_id[i] = id;
-			r_mess_data[i*3+i+0] = b1;
-			r_mess_data[i*3+i+1] = b2;
-			r_mess_data[i*3+i+2] = b3;
-			r_mess_data[i*3+i+3] = b4;
-			res = 1;
-		}
-	}
-	return res;
-}
-
-
-//  помещаем в очередь сообщения для отправки
-int  can_save_wr(int id, char b1, char b2, char b3, char b4)
-{
-	int res = 0 ; 
-	for(int i=0; i<9; i++){
-		if( w_mess_id[i]==0 && res==0){
-			w_mess_id[i] = id;
-			w_mess_data[i*3+i+0] = b1;
-			w_mess_data[i*3+i+1] = b2;
-			w_mess_data[i*3+i+2] = b3;
-			w_mess_data[i*3+i+3] = b4;
-			res = 1;
-		}
-	}
-	return res;
-}
-
-// выбираем сообщение из очереди для обработки
-// и  помещаем в раб. переменные
-int  can_select_rd()
-{
-	int res = 0;
-	
-	r_id=0;
-	r_b1=0;
-	r_b2=0;
-	r_b3=0;
-	r_b4=0;
-	
-	for(int i=0; i<9; i++){
-		if( r_mess_id[i] != 0  && res==0 ) {
-			r_id = r_mess_id[i] ;  
-			r_b1 = r_mess_data[i*3+i+0];
-			r_b2 = r_mess_data[i*3+i+1];
-			r_b3 = r_mess_data[i*3+i+2];
-			r_b4 = r_mess_data[i*3+i+3];
-			r_mess_id[i] = 0 ;
-			res=1;
-		}
-	}
-	return res;
-}
-
-
-
-
-// выбираем сообщение из очереди для отправки
-// и  помещаем в раб. переменные
-int  can_select_wr()
-{
-
-	int res = 0;
-	
-	w_id=0;
-	w_b1=0;
-	w_b2=0;
-	w_b3=0;
-	w_b4=0;
-	
-	for(int i=0; i<9; i++){
-		if( w_mess_id[i] != 0  && res==0 ) {
-			w_id = w_mess_id[i] ; 
-			w_b1 = w_mess_data[i*3+i+0];
-			w_b2 = w_mess_data[i*3+i+1];
-			w_b3 = w_mess_data[i*3+i+2];
-			w_b4 = w_mess_data[i*3+i+3];
-			w_mess_id[i] = 0 ;
-			res=1;
-		}
-	}
-	
-	return res;
-}
-
-
-
-
-
-
-
-
-
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/can.h
--- a/src/can.h	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-#ifndef CAN_H
-#define CAN_H
-
-int  can_save_rd(int,char,char,char,char);
-int  can_save_wr(int,char,char,char,char);
-int  can_select_rd();
-int  can_select_wr();
-
-#endif
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/config_io.h
--- a/src/config_io.h	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-// -------------------------------------------------------------//
-
-
-//------- discr output ------------
-DigitalOut  	led (PA_6);		// выход LED на плате
-
-//-----  port  UART --------------
-//Serial 	uart(PA_0, PA_1);	// tx, rx 
-DigitalOut  	led_r (PA_1);	// выход LED 
-DigitalOut  	led_b (PA_0);	// выход LED  
-
-
-
-DigitalOut  	y_1 (PC_4);		// выход 1
-DigitalOut  	y_2 (PC_5);		// выход 2
-DigitalOut  	y_3 (PC_6);		// выход 3
-DigitalOut  	y_4 (PC_7);		// выход 4
-DigitalOut  	y_5 (PC_8);		// выход 4
-DigitalOut  	y_6 (PC_9);		// выход 4
-DigitalOut  	y_7 (PC_10);	// выход 4
-DigitalOut  	y_8 (PC_11);	// выход 4
-
-DigitalOut  	txd (PA_0);		// for test 
-
-//------- discr input  i2c  PCA9555  ------------
-PCAL9555   gpio_exp( PB_9, PB_8, 0x42);   //  SDA, SCL, Slave_address
-GpioBusIn  inps( gpio_exp, X1_7, X1_6, X1_5, X1_4, X1_3, X1_2, X1_1, X1_0, X0_7, X0_6, X0_5, X0_4, X0_3, X0_2, X0_1, X0_0 );
-
-
-//------- analog input --------------------
-AnalogIn  aninp1(PC_0); 
-AnalogIn  aninp2(PC_1); 
-AnalogIn  aninp3(PC_2); 
-AnalogIn  aninp4(PC_3); 
-
-//------- analog output  ------------------
-AnalogOut anout1(PA_4);
-AnalogOut anout2(PA_5);
-
-
-//--------  for SERIAL interface ----------
-Serial 	pc(PA_2, PA_3);					// tx, rx
-
-
-//----------- SPI interface AT45 FLASH  -----------
-SPI 	spi(PB_15, PB_14, PB_13);		// mosi, miso, sclk
-AT45 	spif(&spi, PB_12);				// cs 
-
-//--------- CAN_BUS  --------------------
-CAN can(PA_11,PA_12);	
-
-//--------- sys timer -----------------
-Timer st;
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/can.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/can.cpp	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,142 @@
+
+#include <mbed.h>
+#include "rtos.h"
+#include "can.h"
+#include "ext_vars.h"
+
+
+//-------------хранение полученного  сообщения --------------
+//
+//                             [b1  b2  b3  b4]
+//                             -----------------
+// r_mess id[0] -> r_mess_data [ 0   1   2   3] - новое сообщение
+// r_mess id[1] -> r_mess_data [ 4   5   6   7]	- новое сообщение
+// r_mess id[2] -> r_mess_data [ 8   9  10  11]	- новое сообщение
+// r_mess id[3] -> r_mess_data [12  13  14  15]	- новое сообщение
+// r_mess id[4] -> r_mess_data [16  17  18  19]	- новое сообщение
+// r_mess id[5] -> r_mess_data [20  21  22  23]	- новое сообщение
+// r_mess id[6] -> r_mess_data [24  25  26  27]	- новое сообщение
+// r_mess id[7] -> r_mess_data [28  29  30  31]	- новое сообщение
+// r_mess id[8] -> r_mess_data [32  33  34  35]	- новое сообщение
+// r_mess id[9] -> r_mess_data [36  37  38  39]	- новое сообщение
+
+
+//--------- очередь сообщений на отправку ------------------
+//
+//                             [b1  b2  b3  b4]
+//                             -----------------
+// w_mess id[0] -> w_mess_data [ 0   1   2   3] - новое сообщение
+// w_mess id[1] -> w_mess_data [ 4   5   6   7]	- новое сообщение
+// w_mess id[2] -> w_mess_data [ 8   9  10  11]	- новое сообщение
+// w_mess id[3] -> w_mess_data [12  13  14  15]	- новое сообщение
+// w_mess id[4] -> w_mess_data [16  17  18  19]	- новое сообщение
+// w_mess id[5] -> w_mess_data [20  21  22  23]	- новое сообщение
+// w_mess id[6] -> w_mess_data [24  25  26  27]	- новое сообщение
+// w_mess id[7] -> w_mess_data [28  29  30  31]	- новое сообщение
+// w_mess id[8] -> w_mess_data [32  33  34  35]	- новое сообщение
+// w_mess id[9] -> w_mess_data [36  37  38  39]	- новое сообщение
+
+
+
+
+//  помещаем в очередь полученное сообщение 
+int  can_save_rd(int id, char b1, char b2, char b3, char b4)
+{
+	int res = 0 ; 
+	for(int i=0; i<9; i++){
+		if( r_mess_id[i]==0 && res==0){
+			r_mess_id[i] = id;
+			r_mess_data[i*3+i+0] = b1;
+			r_mess_data[i*3+i+1] = b2;
+			r_mess_data[i*3+i+2] = b3;
+			r_mess_data[i*3+i+3] = b4;
+			res = 1;
+		}
+	}
+	return res;
+}
+
+
+//  помещаем в очередь сообщения для отправки
+int  can_save_wr(int id, char b1, char b2, char b3, char b4)
+{
+	int res = 0 ; 
+	for(int i=0; i<9; i++){
+		if( w_mess_id[i]==0 && res==0){
+			w_mess_id[i] = id;
+			w_mess_data[i*3+i+0] = b1;
+			w_mess_data[i*3+i+1] = b2;
+			w_mess_data[i*3+i+2] = b3;
+			w_mess_data[i*3+i+3] = b4;
+			res = 1;
+		}
+	}
+	return res;
+}
+
+// выбираем сообщение из очереди для обработки
+// и  помещаем в раб. переменные
+int  can_select_rd()
+{
+	int res = 0;
+	
+	r_id=0;
+	r_b1=0;
+	r_b2=0;
+	r_b3=0;
+	r_b4=0;
+	
+	for(int i=0; i<9; i++){
+		if( r_mess_id[i] != 0  && res==0 ) {
+			r_id = r_mess_id[i] ;  
+			r_b1 = r_mess_data[i*3+i+0];
+			r_b2 = r_mess_data[i*3+i+1];
+			r_b3 = r_mess_data[i*3+i+2];
+			r_b4 = r_mess_data[i*3+i+3];
+			r_mess_id[i] = 0 ;
+			res=1;
+		}
+	}
+	return res;
+}
+
+
+
+
+// выбираем сообщение из очереди для отправки
+// и  помещаем в раб. переменные
+int  can_select_wr()
+{
+
+	int res = 0;
+	
+	w_id=0;
+	w_b1=0;
+	w_b2=0;
+	w_b3=0;
+	w_b4=0;
+	
+	for(int i=0; i<9; i++){
+		if( w_mess_id[i] != 0  && res==0 ) {
+			w_id = w_mess_id[i] ; 
+			w_b1 = w_mess_data[i*3+i+0];
+			w_b2 = w_mess_data[i*3+i+1];
+			w_b3 = w_mess_data[i*3+i+2];
+			w_b4 = w_mess_data[i*3+i+3];
+			w_mess_id[i] = 0 ;
+			res=1;
+		}
+	}
+	
+	return res;
+}
+
+
+
+
+
+
+
+
+
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/can.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/can.h	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,10 @@
+#ifndef CAN_H
+#define CAN_H
+
+int  can_save_rd(int,char,char,char,char);
+int  can_save_wr(int,char,char,char,char);
+int  can_select_rd();
+int  can_select_wr();
+
+#endif
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/config_io.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/config_io.h	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,54 @@
+// -------------------------------------------------------------//
+
+
+//------- discr output ------------
+DigitalOut  	led (PA_6);		// выход LED на плате
+
+//-----  port  UART --------------
+//Serial 	uart(PA_0, PA_1);	// tx, rx 
+DigitalOut  	led_r (PA_1);	// выход LED 
+DigitalOut  	led_b (PA_0);	// выход LED  
+
+
+
+DigitalOut  	y_1 (PC_4);		// выход 1
+DigitalOut  	y_2 (PC_5);		// выход 2
+DigitalOut  	y_3 (PC_6);		// выход 3
+DigitalOut  	y_4 (PC_7);		// выход 4
+DigitalOut  	y_5 (PC_8);		// выход 4
+DigitalOut  	y_6 (PC_9);		// выход 4
+DigitalOut  	y_7 (PC_10);	// выход 4
+DigitalOut  	y_8 (PC_11);	// выход 4
+
+DigitalOut  	txd (PA_0);		// for test 
+
+//------- discr input  i2c  PCA9555  ------------
+PCAL9555   gpio_exp( PB_9, PB_8, 0x42);   //  SDA, SCL, Slave_address
+GpioBusIn  inps( gpio_exp, X1_7, X1_6, X1_5, X1_4, X1_3, X1_2, X1_1, X1_0, X0_7, X0_6, X0_5, X0_4, X0_3, X0_2, X0_1, X0_0 );
+
+
+//------- analog input --------------------
+AnalogIn  aninp1(PC_0); 
+AnalogIn  aninp2(PC_1); 
+AnalogIn  aninp3(PC_2); 
+AnalogIn  aninp4(PC_3); 
+
+//------- analog output  ------------------
+AnalogOut anout1(PA_4);
+AnalogOut anout2(PA_5);
+
+
+//--------  for SERIAL interface ----------
+Serial 	pc(PA_2, PA_3);					// tx, rx
+
+
+//----------- SPI interface AT45 FLASH  -----------
+SPI 	spi(PB_15, PB_14, PB_13);		// mosi, miso, sclk
+AT45 	spif(&spi, PB_12);				// cs 
+
+//--------- CAN_BUS  --------------------
+CAN can(PA_11,PA_12);	
+
+//--------- sys timer -----------------
+Timer st;
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/main.cpp	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,623 @@
+
+/***  PLC  F446RE    ***/
+// 512 KB Flash  / 128 KB SRAM System  / 4 KB SRAM Backup 
+
+#include "mbed.h"
+#include "rtos.h"
+#include "AT45.h"
+#include "PCAL9555.h"
+
+#include "can.h"
+#include "config_io.h"
+#include "ext_vars.h"
+#include "set_vars.h"
+
+#include "task_ob.h"
+
+#define CAN_BAUD 	50000	// скорость 
+#define UART_BAUD 	9600	// скорость 
+#define MAX_SERL  	30		// макс. длинна строки из usb/uart
+
+
+
+
+/*******  создание  локальных переменных *************************/
+
+int   	busin = 0; 	
+int   	t_sys = 0 ;	
+
+char  	pc_buffer [MAX_SERL+2];
+int   	pc_i=0;
+int   	pc_im=0;
+
+float	st_start=0.0;
+float	st_end=0.0;
+float	st_old=0.0; 
+float	st_cycl=0.0; 
+float	st_task=0.0; 
+
+int 	new_outs=0;
+
+/**********  прототипы локальных функций  **********************/
+void 	read_inputs(); 
+void 	write_outs();
+void    save_stat();
+void	logic_tasks();	
+void 	can_rw();
+void  	timers();
+void	pc_rd();
+int   	read_val(); 
+
+/**************  Threads  **************************************/
+Thread	read_uart; 
+Thread  work_can;	
+RtosTimer t_10msec(&logic_tasks); 
+
+
+/*************** старт программы  PLC **************************/
+int main()
+{
+	led=1;
+	st.start(); 
+	
+	// ----- настраиваем CAN  ------ 
+	can.frequency(CAN_BAUD);
+
+	//----- настраиваем порт USB  ------ 
+	pc.baud(UART_BAUD);
+	pc.printf( "\r\n> START PLC \r\n");
+	pc.printf(">CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
+
+
+	//------  проверка  FLASH  ----------
+	pc.printf("> flash size: %d bytes \n",  spif.device_size());
+	
+	
+	//-------  запускаем  потоки  Thread  ------
+	work_can.start(can_rw);	// обмен информ. по CAN
+    read_uart.start(pc_rd); // чтение UART
+	
+   
+    //--- запускаем логич.задач по таймеру  10msec ------
+    t_10msec.start(10); 		
+    
+
+	/***  обработка команд по USB  ***/
+    while (true) {
+		
+		if(t_sys<500){led=1;}else{led=0;}
+		led_r=led; 
+		
+		// проверяем usb
+       	if (pc_i>1 && pc_i==pc_im){            
+            pc_i = 0;
+            //pc.printf("usb:%s",pc_buffer);
+            //led = !led;
+            
+
+			// ---  устанавливаем значение  переменных ----
+            if(strstr(pc_buffer,"=")){
+				
+				if(strstr (pc_buffer,"vr000")) { vr000=read_val();  pc.printf( "ok\n"); }
+				if(strstr (pc_buffer,"vr001")) { vr001=read_val();  pc.printf( "ok\n"); }
+				if(strstr (pc_buffer,"vr002")) { vr002=read_val();  pc.printf( "ok\n"); }
+								
+				if(strstr (pc_buffer,"pr001")) { pr001=read_val();  pc.printf( "ok\n"); }
+				if(strstr (pc_buffer,"pr002")) { pr002=read_val();  pc.printf( "ok\n"); }
+				
+			}
+			
+			// ---  проверка значения  переменных ----- 
+            if(strstr(pc_buffer,"?")){
+				
+				if(strstr (pc_buffer,"vr000")) { pc.printf( "vr000:%d\n", vr000); }
+				if(strstr (pc_buffer,"vr001")) { pc.printf( "vr001:%d\n", vr001); }
+				if(strstr (pc_buffer,"vr002")) { pc.printf( "vr002:%d\n", vr002); }
+
+				if(strstr (pc_buffer,"pr001")) { pc.printf( "pr001:%d\n", pr001); }
+				if(strstr (pc_buffer,"pr002")) { pc.printf( "pr002:%d\n", pr002); }
+				
+				
+				//  для контроля состояния 
+				
+				if(strstr (pc_buffer,"dc_in"))  { pc.printf( "\n--- PLC --- \n> inputs:%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n", x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16); }
+				if(strstr (pc_buffer,"dc_out")) { pc.printf( "\n--- PLC --- \n> outputs:%d%d%d%d%d%d%d%d%\n", y01,y02,y03,y04,y05,y06,y07,y08);  }
+				if(strstr (pc_buffer,"an_in"))  { pc.printf( "\n--- PLC --- \n> an_in1=%f an_in2=%f an_in3=%f an_in4=%f \n", Vin_1, Vin_2, Vin_3, Vin_4 ); }
+				if(strstr (pc_buffer,"an_out")) { pc.printf( "\n--- PLC --- \n> an_out1=%f an_out2=%f \n", Vout_1, Vout_2 ); }
+				if(strstr (pc_buffer,"stime"))  { pc.printf( "\n--- PLC --- \n> work cycle %f / using %f  sec \n", st_cycl, st_task ); }
+				
+				if(strstr (pc_buffer,"sm-1"))	{ pc.printf( "\n--- modul SM01 adr=1 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm1_pos, sm1_mov, sm1_alr, a101, a102, a103, a104, b101, b102 ); }
+				if(strstr (pc_buffer,"sm-2"))	{ pc.printf( "\n--- modul SM01 adr=2 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm2_pos, sm2_mov, sm2_alr, a201, a202, a203, a204, b201, b202 ); }
+				if(strstr (pc_buffer,"sm-3"))	{ pc.printf( "\n--- modul SM01 adr=3 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm3_pos, sm3_mov, sm3_alr, a301, a302, a303, a304, b301, b302 ); }
+				if(strstr (pc_buffer,"sm-4"))	{ pc.printf( "\n--- modul SM01 adr=4 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm4_pos, sm4_mov, sm4_alr, a401, a402, a403, a404, b401, b402 ); }
+				
+				if(strstr (pc_buffer,"dm-1"))	{ pc.printf( "\n--- modul DM0806  adr=1 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x101,x102,x103,x104,x105,x106,x107,x108, y101,y102,y103,y104,y105,y106 ); }
+				if(strstr (pc_buffer,"dm-2"))	{ pc.printf( "\n--- modul DM0806  adr=2 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x201,x202,x203,x204,x205,x206,x207,x208, y201,y202,y203,y204,y205,y206 ); }
+				if(strstr (pc_buffer,"dm-3"))	{ pc.printf( "\n--- modul DM0806  adr=3 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x301,x302,x303,x304,x305,x306,x307,x308, y301,y302,y303,y304,y305,y306 ); }
+				if(strstr (pc_buffer,"dm-4"))	{ pc.printf( "\n--- modul DM0806  adr=4 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x401,x402,x403,x404,x405,x406,x407,x408, y401,y402,y403,y404,y405,y406 ); }
+				
+			}
+			
+			if(strstr (pc_buffer,"reset")) { NVIC_SystemReset() ; }
+			
+			
+
+		 } 
+
+		pc_im=pc_i; 
+        Thread::wait(100);
+    }
+    
+}
+
+
+/****************  дополнительные  функции  **********************/
+
+// логические  задачи.  вызываются для выполнения
+// каждые 10 мсек
+void logic_tasks(){
+	// чтение сист.таймера
+	st_start=st.read();
+	
+	
+	// подготовка входн.информации
+	timers();        
+	read_inputs();
+	
+	// логичкские задачи
+	task_ob(); 
+	
+	// формирование выходн.информации
+	write_outs(); 
+	save_stat();
+	
+	// определяем реальное время цикла/использ.время
+	st_end=st.read();
+	st_task=st_end-st_start;
+	st_cycl=st_start-st_old;
+	st_old=st_start;
+
+}
+
+
+//----------------------------------------
+// установка   выходов  контроллера
+// в соответствии  значения преременным
+void write_outs(){
+	// устанавливаем локальные выходы ПЛК
+	y_1=y01;	y_5=y05;
+	y_2=y02;	y_6=y06;
+	y_3=y03;	y_7=y07;
+	y_4=y04;	y_8=y08; 
+	
+	anout1=Vout_1;
+    anout2=Vout_2;
+    
+	//  упаковываем  выходы для DM0806 ADR=1 
+	dm1_outs = 0;
+	if(y106==1){dm1_outs = dm1_outs |1;}		// y106
+	dm1_outs = dm1_outs << 1; 
+	if(y105==1){dm1_outs = dm1_outs |1;}		// y105
+	dm1_outs = dm1_outs << 1; 
+	if(y104==1){dm1_outs = dm1_outs |1;}		// y104
+	dm1_outs = dm1_outs << 1; 
+	if(y103==1){dm1_outs = dm1_outs |1;}		// y103
+	dm1_outs = dm1_outs << 1;
+	if(y102==1){dm1_outs = dm1_outs |1;}		// y102
+	dm1_outs = dm1_outs << 1;
+	if(y101==1){dm1_outs = dm1_outs |1;}		// y101
+	
+	//  упаковываем  выходы для DM0806 ADR=2
+	dm2_outs = 0;
+	if(y206==1){dm2_outs = dm2_outs |1;}		// y206
+	dm2_outs = dm2_outs << 1; 
+	if(y205==1){dm2_outs = dm2_outs |1;}		// y205
+	dm2_outs = dm2_outs << 1; 
+	if(y204==1){dm2_outs = dm2_outs |1;}		// y204
+	dm2_outs = dm2_outs << 1; 
+	if(y203==1){dm2_outs = dm2_outs |1;}		// y203
+	dm2_outs = dm2_outs << 1;
+	if(y202==1){dm2_outs = dm2_outs |1;}		// y202
+	dm2_outs = dm2_outs << 1;
+	if(y201==1){dm2_outs = dm2_outs |1;}		// y201
+	
+	//  упаковываем  выходы для DM0806 ADR=3
+	dm3_outs = 0;
+	if(y306==1){dm3_outs = dm3_outs |1;}		// y306
+	dm3_outs = dm3_outs << 1; 
+	if(y305==1){dm3_outs = dm3_outs |1;}		// y305
+	dm3_outs = dm3_outs << 1; 
+	if(y304==1){dm3_outs = dm3_outs |1;}		// y304
+	dm3_outs = dm3_outs << 1; 
+	if(y303==1){dm3_outs = dm3_outs |1;}		// y303
+	dm3_outs = dm3_outs << 1;
+	if(y302==1){dm3_outs = dm3_outs |1;}		// y302
+	dm3_outs = dm3_outs << 1;
+	if(y301==1){dm3_outs = dm3_outs |1;}		// y301
+	
+	
+	//  упаковываем  выходы для DM0806 ADR=4
+	dm4_outs = 0;
+	if(y406==1){dm4_outs = dm4_outs |1;}		// y406
+	dm4_outs = dm4_outs << 1; 
+	if(y405==1){dm4_outs = dm4_outs |1;}		// y405
+	dm4_outs = dm4_outs << 1; 
+	if(y404==1){dm4_outs = dm4_outs |1;}		// y404
+	dm4_outs = dm4_outs << 1; 
+	if(y403==1){dm4_outs = dm4_outs |1;}		// y403
+	dm4_outs = dm4_outs << 1;
+	if(y402==1){dm4_outs = dm4_outs |1;}		// y402
+	dm4_outs = dm4_outs << 1;
+	if(y401==1){dm4_outs = dm4_outs |1;}		// y401	
+	
+	
+	// при изменении по DM0806 посылаем в CAN
+    if(dm1_outs!=mdm1_outs || dm2_outs!=mdm2_outs || dm3_outs!=mdm3_outs || dm4_outs!=mdm4_outs){
+		int  _id=50;
+		char _b1= dm1_outs;
+		char _b2= dm2_outs ;
+		char _b3= dm3_outs ;
+		char _b4= dm4_outs ;
+		can_save_wr(_id,_b1,_b2,_b3,_b4);
+	}
+	
+	
+	//  упаковываем  выходы для SM01 ADR=1-4 
+	sm_outs=0; 
+	if(b402==1){sm_outs = sm_outs |1;}			// b402
+	sm_outs = sm_outs << 1;		
+	if(b401==1){sm_outs = sm_outs |1;}			// b401
+	sm_outs = sm_outs << 1;		
+	if(b302==1){sm_outs = sm_outs |1;}			// b302
+	sm_outs = sm_outs << 1;		
+	if(b301==1){sm_outs = sm_outs |1;}			// b301
+	sm_outs = sm_outs << 1;		
+	if(b202==1){sm_outs = sm_outs |1;}			// b202
+	sm_outs = sm_outs << 1;		
+	if(b201==1){sm_outs = sm_outs |1;}			// b201
+	sm_outs = sm_outs << 1;		
+	if(b102==1){sm_outs = sm_outs |1;}			// b102
+	sm_outs = sm_outs << 1;		
+	if(b101==1){sm_outs = sm_outs |1;}			// b101
+
+    
+    // при изменении по SM01 посылаем в CAN
+    if(sm_outs != msm_outs  ||  sm_position != msm_position){
+		int  _id=60;
+		char _b1=dm1_outs;
+		char _b2= sm_position / 100 ;
+		char _b3= (sm_position - _b2*100) / 10  ;
+		char _b4= (sm_position - _b2*100 - _b3*10)  ;
+		can_save_wr(_id,_b1,_b2,_b3,_b4);
+	}
+    
+
+}
+
+
+//----------------------------------------
+// формирование  значения  переменных
+// в соответствии  с  сигналами на  входах контроллера
+// и  принятой по CAN информацией
+void read_inputs(){
+	// считываем локальные выходы ПЛК
+    busin=inps;       
+    if(busin & 1){ x01=0; }else{ x01=1;}
+	if(busin & 2){ x02=0; }else{ x02=1;}
+	if(busin & 4){ x03=0; }else{ x03=1;}
+	if(busin & 8){ x04=0; }else{ x04=1;}
+	if(busin & 16){ x05=0; }else{ x05=1;}
+	if(busin & 32){ x06=0; }else{ x06=1;}
+	if(busin & 64){ x07=0; }else{ x07=1;}
+	if(busin & 128){ x08=0; }else{ x08=1;}
+	if(busin & 256){ x09=0; }else{ x09=1;}
+	if(busin & 512){ x10=0; }else{ x10=1;}
+	if(busin & 1024){ x11=0; }else{ x11=1;}
+	if(busin & 2048){ x12=0; }else{ x12=1;}
+	if(busin & 4096){ x13=0; }else{ x13=1;}
+	if(busin & 8192){ x14=0; }else{ x14=1;}
+	if(busin & 16384){ x15=0; }else{ x15=1;}
+	if(busin & 32768){ x16=0; }else{ x16=1;}
+	
+	Vin_1 =  aninp1;
+    Vin_2 =  aninp2;
+    Vin_3 =  aninp3;
+    Vin_4 =  aninp4;
+    
+    // проверяем принятые посылки CAN
+	int resalt=1;
+	while(resalt==1){
+		resalt=can_select_rd();
+		if(resalt==1){
+			
+			//  inps from DM ADR=1
+			if(r_id==51){
+				if( r_b1&1    ){ x101=1; } else { x101=0; }
+				if((r_b1>>1)&1){ x102=1; } else { x102=0; }
+				if((r_b1>>2)&1){ x103=1; } else { x103=0; }
+				if((r_b1>>3)&1){ x104=1; } else { x104=0; }
+				if((r_b1>>4)&1){ x105=1; } else { x105=0; }
+				if((r_b1>>5)&1){ x106=1; } else { x106=0; }
+				if((r_b1>>6)&1){ x107=1; } else { x107=0; }
+				if((r_b1>>7)&1){ x108=1; } else { x108=0; }
+			}
+			
+			//  inps from DM ADR=2
+			if(r_id==52){
+				if( r_b1&1    ){ x201=1; } else { x201=0; }
+				if((r_b1>>1)&1){ x202=1; } else { x202=0; }
+				if((r_b1>>2)&1){ x203=1; } else { x203=0; }
+				if((r_b1>>3)&1){ x204=1; } else { x204=0; }
+				if((r_b1>>4)&1){ x205=1; } else { x205=0; }
+				if((r_b1>>5)&1){ x206=1; } else { x206=0; }
+				if((r_b1>>6)&1){ x207=1; } else { x207=0; }
+				if((r_b1>>7)&1){ x208=1; } else { x208=0; }
+			}
+			
+			//  inps from DM ADR=3
+			if(r_id==53){
+				if( r_b1&1    ){ x301=1; } else { x301=0; }
+				if((r_b1>>1)&1){ x302=1; } else { x302=0; }
+				if((r_b1>>2)&1){ x303=1; } else { x303=0; }
+				if((r_b1>>3)&1){ x304=1; } else { x304=0; }
+				if((r_b1>>4)&1){ x305=1; } else { x305=0; }
+				if((r_b1>>5)&1){ x306=1; } else { x306=0; }
+				if((r_b1>>6)&1){ x307=1; } else { x307=0; }
+				if((r_b1>>7)&1){ x308=1; } else { x308=0; }
+			}
+			
+			//  inps from DM ADR=4
+			if(r_id==54){
+				if( r_b1&1    ){ x401=1; } else { x401=0; }
+				if((r_b1>>1)&1){ x402=1; } else { x402=0; }
+				if((r_b1>>2)&1){ x403=1; } else { x403=0; }
+				if((r_b1>>3)&1){ x404=1; } else { x404=0; }
+				if((r_b1>>4)&1){ x405=1; } else { x405=0; }
+				if((r_b1>>5)&1){ x406=1; } else { x406=0; }
+				if((r_b1>>6)&1){ x407=1; } else { x407=0; }
+				if((r_b1>>7)&1){ x408=1; } else { x408=0; }
+			}
+			
+			//  inps from SM ADR=1
+			if(r_id==61){
+				if(r_b1 & 4) { a101=1; } else{ a101=0; }
+				if(r_b1 & 8) { a102=1; } else{ a102=0; }
+				if(r_b1 & 16){ a103=1; } else{ a103=0; }
+				if(r_b1 & 32){ a104=1; } else{ a104=0; }
+				if(r_b1 & 64){  sm1_mov=1; }  else{ sm1_mov=0; }
+				if(r_b1 & 128){ sm1_alr=1; }  else{ sm1_alr=0; }
+				sm1_pos = r_b2*100+r_b3*10+r_b4;
+			}
+			
+			//  inps from SM ADR=2
+			if(r_id==62){
+				if(r_b1 & 4) { a201=1; } else{ a201=0; }
+				if(r_b1 & 8) { a202=1; } else{ a202=0; }
+				if(r_b1 & 16){ a203=1; } else{ a203=0; }
+				if(r_b1 & 32){ a204=1; } else{ a204=0; }
+				if(r_b1 & 64){  sm2_mov=1; }  else{ sm2_mov=0; }
+				if(r_b1 & 128){ sm2_alr=1; }  else{ sm2_alr=0; }
+				sm2_pos = r_b2*100+r_b3*10+r_b4;
+			}
+			
+			//  inps from SM ADR=3
+			if(r_id==63){
+				if(r_b1 & 4) { a301=1; } else{ a301=0; }
+				if(r_b1 & 8) { a302=1; } else{ a302=0; }
+				if(r_b1 & 16){ a303=1; } else{ a303=0; }
+				if(r_b1 & 32){ a304=1; } else{ a304=0; }
+				if(r_b1 & 64){  sm3_mov=1; }  else{ sm3_mov=0; }
+				if(r_b1 & 128){ sm3_alr=1; }  else{ sm3_alr=0; }
+				sm3_pos = r_b2*100+r_b3*10+r_b4;
+			}
+			
+			//  inps from SM ADR=4
+			if(r_id==64){
+				if(r_b1 & 4) { a401=1; } else{ a401=0; }
+				if(r_b1 & 8) { a402=1; } else{ a402=0; }
+				if(r_b1 & 16){ a403=1; } else{ a403=0; }
+				if(r_b1 & 32){ a404=1; } else{ a404=0; }
+				if(r_b1 & 64){  sm4_mov=1; }  else{ sm4_mov=0; }
+				if(r_b1 & 128){ sm4_alr=1; }  else{ sm4_alr=0; }
+				sm4_pos = r_b2*100+r_b3*10+r_b4;
+			}
+
+
+
+		}
+	}
+    
+}
+
+//----------------------------------------
+//  сохранение значения переменных  для  обработки
+//  в  след.цикле  (установка, сброс)
+void save_stat(){
+	
+	mx01=x01;	mx02=x02;	mx03=x03;	mx04=x04;    
+	mx05=x05;	mx06=x06;	mx07=x07;	mx08=x08;    
+	mx09=x09;	mx10=x10;	mx11=x11;	mx12=x12;    
+	mx13=x13;	mx14=x14;	mx15=x15;	mx16=x16;
+	my01=y01;	my02=y02;	my03=y03;	my04=y04;    
+	my05=y05;	my06=y06;	my07=y07;	my08=y08;  	
+	
+	mx101=x101;	mx102=x102;	mx103=x103;	mx104=x104;    
+	mx105=x105;	mx106=x106;	mx107=x107;	mx108=x108; 
+	mx201=x201;	mx202=x202;	mx203=x103;	mx204=x104;    
+	mx205=x205;	mx206=x206;	mx207=x107;	mx208=x108;
+	mx301=x301;	mx302=x302;	mx303=x303;	mx304=x304;    
+	mx305=x305;	mx306=x306;	mx307=x307;	mx308=x308;
+	mx401=x401;	mx402=x402;	mx403=x403;	mx404=x404;    
+	mx405=x405;	mx406=x406;	mx407=x407;	mx408=x408;
+	my101=y101;	my102=y102;	my103=y103;	    
+	my104=y104; my105=y105;	my106=y106;	
+	my201=y201;	my202=y202;	my203=y203;	    
+	my204=y204; my205=y205;	my206=y206;	
+	my301=y301;	my302=y302;	my303=y303;	    
+	my304=y304; my305=y305;	my306=y306;	
+	my401=y401;	my402=y402;	my403=y403;	   
+	my404=y404; my405=y405;	my406=y406;	
+	
+	ma101=a101; ma102=a102; ma103=a103; ma104=a104;
+	ma201=a201; ma202=a202; ma203=a203; ma204=a204;
+	ma301=a301; ma302=a302; ma303=a303; ma304=a304;
+	ma401=a401; ma402=a402; ma403=a403; ma404=a404;
+	mb101=b101; mb102=b102; mb201=b201; mb202=b202;
+	mb301=b301; mb302=b302; mb401=b401; mb402=b402;
+	
+	msm_outs=sm_outs;
+	msm_position=sm_position;
+	
+	mdm1_outs=dm1_outs; 
+	mdm2_outs=dm2_outs; 
+	mdm3_outs=dm3_outs; 
+	mdm4_outs=dm4_outs; 
+	
+	
+	
+}
+
+//----------------------------------------
+//  изменение значения  секундных  и  милисекундных  таймеров 
+//  (дискретность 10 мсек)
+void timers(){
+	
+	int i = 10 ;  		// время цикла в 10мсек
+	int max1=30000;		// макс. значение  для мсек таймеров (30мин)
+	int max2=18000;		// макс. значение для сек  таймеров   (5час)
+	
+	// timers,  10ms
+	if(t_sys<1000){
+		t_sys=t_sys+i;
+	}else{
+		t_sys = 0;
+		if(t101<max2){t101=t101+1;}
+		if(t102<max2){t102=t102+1;}
+		if(t103<max2){t103=t103+1;}
+		if(t104<max2){t104=t104+1;}
+		if(t105<max2){t105=t105+1;}
+		if(t106<max2){t106=t106+1;}
+		if(t107<max2){t107=t107+1;}
+		if(t108<max2){t108=t108+1;}
+		if(t109<max2){t109=t109+1;}
+		if(t110<max2){t110=t110+1;}
+	}
+	
+	if(t01<max1){t01=t01+i;}
+	if(t02<max1){t02=t02+i;}
+	if(t03<max1){t03=t03+i;}
+	if(t04<max1){t04=t04+i;}
+	if(t05<max1){t05=t05+i;}
+	if(t06<max1){t06=t06+i;}
+	if(t07<max1){t07=t07+i;}
+	if(t08<max1){t08=t08+i;}
+	if(t09<max1){t09=t09+i;}
+	if(t10<max1){t10=t10+i;}
+	
+}
+
+//----------------------------------------
+// прием  и  отправка  посылок   
+// по  CAN  шине
+void can_rw()
+{
+	CANMessage msg_w;     	 
+	CANMessage msg_r;
+	
+	for(int i=0; i<=10; i++){ r_mess_id[i]=0; w_mess_id[i]=0; }
+	for(int i=0; i<=40; i++){ r_mess_data[i]=0; w_mess_data[i]=0; }
+	
+       
+	while (true){
+		
+		// проверяем, если есть новая посылка 
+		// то помещаем в очередь  can_save_rd()
+		if(can.read(msg_r)){
+			int  id = msg_r.id;
+			char b1 = msg_r.data[0];
+			char b2 = msg_r.data[1];
+			char b3 = msg_r.data[2];
+			char b4 = msg_r.data[3];
+			can_save_rd(id,b1,b2,b3,b4);
+			led_b = !led_b;
+		}
+
+		
+		// проверяем очередь на отправку  can_select_wr()
+		// и если есть , то отправляем  
+		if(can_select_wr()){
+			msg_w.len = 4;
+			msg_w.id 	  = w_id;	
+			msg_w.data[0] = w_b1;
+			msg_w.data[1] = w_b2;
+			msg_w.data[2] = w_b3;
+			msg_w.data[3] = w_b4;
+			can.write(msg_w);
+			
+			if(can.tderror()){ led_b = !led_b; w_alr=1; } else { w_alr=0; }
+			
+		}
+		
+		
+		Thread::wait(2);
+	}
+        
+}
+
+//----------------------------------------
+// посимвольный прием из USB и  сохранение  
+// информации в буфере, обрабатывается после того как все принято
+void pc_rd()
+{
+	sprintf(pc_buffer, "buff_ok");
+	while(1) 
+	{
+		if( pc.readable() )
+		{
+			pc_buffer[pc_i] = pc.getc();
+			if(pc_i<MAX_SERL){pc_i++; }
+			pc_buffer[pc_i]=0; 
+		}
+	}
+}
+
+//----------------------------------------
+// поиск и чтение  значения  из  строки 
+// возвращает целое число. 
+int   read_val() {
+	char  	inp_c[10];
+	int   	val=0;
+	int   	i=0;
+	int   	p=0;
+	
+	while(p<MAX_SERL){	
+		if(pc_buffer[p]=='='){ break ; }
+		p++; 
+	}
+	
+	p++;
+	i=0; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
+	i=1; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
+	i=2; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
+	i=3; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
+	i=4; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
+	i=5; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
+	inp_c[6]=0 ;
+	
+	val = atoi(inp_c);
+	return  val;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/set_vars.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/set_vars.h	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,251 @@
+  
+ /*******   inp-out PLC  ************************************/
+  
+int x01=0;		int mx01=0; 
+int x02=0;		int mx02=0; 
+int x03=0;		int mx03=0; 
+int x04=0;		int mx04=0; 
+int x05=0;		int mx05=0; 
+int x06=0;		int mx06=0; 
+int x07=0;		int mx07=0; 
+int x08=0;		int mx08=0; 
+int x09=0;		int mx09=0; 
+int x10=0;		int mx10=0; 
+int x11=0;		int mx11=0; 
+int x12=0;		int mx12=0; 
+int x13=0;		int mx13=0; 
+int x14=0;		int mx14=0; 
+int x15=0;		int mx15=0; 
+int x16=0;		int mx16=0; 
+
+
+int y01=0;		int my01=0; 
+int y02=0;		int my02=0; 
+int y03=0;		int my03=0; 
+int y04=0;		int my04=0; 
+int y05=0;		int my05=0; 
+int y06=0;		int my06=0; 
+int y07=0;		int my07=0; 
+int y08=0;		int my08=0; 
+
+
+float 	Vin_1=0.0; 
+float 	Vin_2=0.0; 
+float 	Vin_3=0.0;
+float 	Vin_4=0.0;  
+
+float 	Vout_1=0.0; 
+float 	Vout_2=0.0; 
+
+
+int  r_mess_id[10];		int  	w_mess_id[10];
+char r_mess_data[40];	char 	w_mess_data[40];
+
+int  r_id=0 ;			int  w_id=0 ;
+char r_b1=0 ;			char w_b1=0 ;
+char r_b2=0 ;			char w_b2=0 ;
+char r_b3=0 ;			char w_b3=0 ;
+char r_b4=0 ;			char w_b4=0 ;
+						int  w_alr=0 ; 
+
+
+
+/******************  DM0806  moduls *********************************/
+
+// ----- adr 1 ---------
+char dm1_outs=0;
+char mdm1_outs=0;
+
+int x101=0;		int mx101=0; 
+int x102=0;		int mx102=0; 
+int x103=0;		int mx103=0; 
+int x104=0;		int mx104=0; 
+int x105=0;		int mx105=0; 
+int x106=0;		int mx106=0; 
+int x107=0;		int mx107=0; 
+int x108=0;		int mx108=0; 
+
+int y101=0;		int my101=0; 
+int y102=0;		int my102=0; 
+int y103=0;		int my103=0; 
+int y104=0;		int my104=0; 
+int y105=0;		int my105=0; 
+int y106=0;		int my106=0; 
+
+
+// ----- adr 2 ---------
+char dm2_outs=0;
+char mdm2_outs=0;
+
+int x201=0;		int mx201=0; 
+int x202=0;		int mx202=0; 
+int x203=0;		int mx203=0; 
+int x204=0;		int mx204=0; 
+int x205=0;		int mx205=0; 
+int x206=0;		int mx206=0; 
+int x207=0;		int mx207=0; 
+int x208=0;		int mx208=0; 
+
+int y201=0;		int my201=0; 
+int y202=0;		int my202=0; 
+int y203=0;		int my203=0; 
+int y204=0;		int my204=0; 
+int y205=0;		int my205=0; 
+int y206=0;		int my206=0; 
+
+// ----- adr 3 ---------
+char dm3_outs=0;
+char mdm3_outs=0;
+
+int x301=0;		int mx301=0; 
+int x302=0;		int mx302=0; 
+int x303=0;		int mx303=0; 
+int x304=0;		int mx304=0; 
+int x305=0;		int mx305=0; 
+int x306=0;		int mx306=0; 
+int x307=0;		int mx307=0; 
+int x308=0;		int mx308=0; 
+
+int y301=0;		int my301=0; 
+int y302=0;		int my302=0; 
+int y303=0;		int my303=0; 
+int y304=0;		int my304=0; 
+int y305=0;		int my305=0; 
+int y306=0;		int my306=0; 
+
+// ----- adr 4 ---------
+char dm4_outs=0;
+char mdm4_outs=0;
+
+int x401=0;		int mx401=0; 
+int x402=0;		int mx402=0; 
+int x403=0;		int mx403=0; 
+int x404=0;		int mx404=0; 
+int x405=0;		int mx405=0; 
+int x406=0;		int mx406=0; 
+int x407=0;		int mx407=0; 
+int x408=0;		int mx408=0; 
+
+int y401=0;		int my401=0; 
+int y402=0;		int my402=0; 
+int y403=0;		int my403=0; 
+int y404=0;		int my404=0; 
+int y405=0;		int my405=0; 
+int y406=0;		int my406=0; 
+
+
+/******************** for  SM01  moduls *****************************/
+int	 sm_position=0;
+char sm_outs =0;
+
+int	 msm_position=0;
+char msm_outs =0;
+
+ // ----- adr 1  ---------
+int sm1_pos=0;
+int sm1_mov=0;
+int sm1_alr=0;
+
+int a101=0;		int ma101=0;
+int a102=0;		int ma102=0;
+int a103=0;		int ma103=0;
+int a104=0;		int ma104=0;
+
+int b101=0;		int mb101=0;
+int b102=0;		int mb102=0;
+
+
+// ----- adr 2  ---------
+int sm2_pos=0;
+int sm2_mov=0;
+int sm2_alr=0;
+
+int a201=0;		int ma201=0;
+int a202=0;		int ma202=0;
+int a203=0;		int ma203=0;
+int a204=0;		int ma204=0;
+
+int b201=0;		int mb201=0;
+int b202=0;		int mb202=0;
+ 
+ 
+ // ----- adr 3  ---------
+int sm3_pos=0;
+int sm3_mov=0;
+int sm3_alr=0;
+
+int a301=0;		int ma301=0;
+int a302=0;		int ma302=0;
+int a303=0;		int ma303=0;
+int a304=0;		int ma304=0;
+
+int b301=0;		int mb301=0;
+int b302=0;		int mb302=0;
+  
+  
+ // ----- adr 4  ---------
+int sm4_pos=0;
+int sm4_mov=0;
+int sm4_alr=0;
+
+int a401=0;		int ma401=0;
+int a402=0;		int ma402=0;
+int a403=0;		int ma403=0;
+int a404=0;		int ma404=0;
+
+int b401=0;		int mb401=0;
+int b402=0;		int mb402=0;
+
+
+
+/***************  for user *******************************************/
+
+// ------------------------
+int t01=0;		int t101=0;
+int t02=0;		int t102=0;
+int t03=0;		int t103=0;
+int t04=0;		int t104=0;
+int t05=0;		int t105=0;
+int t06=0;		int t106=0;
+int t07=0;		int t107=0;
+int t08=0;		int t108=0;
+int t09=0;		int t109=0;
+int t10=0;		int t110=0;
+
+
+// ---------------------------
+int vr000 = 0 ; 
+int vr001 = 2 ; 
+int vr002 = 0 ; 
+int vr003 = 0 ; 
+int vr004 = 0 ; 
+int vr005 = 0 ; 
+int vr007 = 0 ; 
+int vr008 = 0 ; 
+int vr009 = 0 ; 
+int vr010 = 0 ; 
+int vr011 = 0 ; 
+int vr012 = 0 ; 
+int vr013 = 0 ; 
+
+int pr001 = 0 ; 
+int pr002 = 0 ; 
+
+int al001 = 0 ;
+int al002 = 1 ;
+int al003 = 1 ;
+int al004 = 0 ;
+int al005 = 0 ;
+int al006 = 0 ;
+int al007 = 0 ;
+int al008 = 0 ;
+int al009 = 0 ;
+int al010 = 0 ;
+int al011 = 0 ;
+int al012 = 0 ;
+int al013 = 0 ;
+int al014 = 0 ;
+
+
+
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/task_ob.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/task_ob.h	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,5 @@
+#ifndef TASK_OB_H
+#define TASK_OB_H
+int task_ob();
+#endif
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/task_pb1.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/task_pb1.h	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,5 @@
+#ifndef TASK_PB1_H
+#define TASK_PB1_H
+int task_pb1();
+#endif
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/task_pb2.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/task_pb2.h	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,5 @@
+#ifndef TASK_PB2_H
+#define TASK_PB2_H
+int task_pb2();
+#endif
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/f/task_pb3.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/f/task_pb3.h	Fri Feb 12 10:55:27 2021 +0000
@@ -0,0 +1,5 @@
+#ifndef TASK_PB3_H
+#define TASK_PB3_H
+int task_pb3();
+#endif
+
diff -r 3768b56b12e7 -r 439534d6bb89 src/main.cpp
--- a/src/main.cpp	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,623 +0,0 @@
-
-/***  PLC  F446RE    ***/
-// 512 KB Flash  / 128 KB SRAM System  / 4 KB SRAM Backup 
-
-#include "mbed.h"
-#include "rtos.h"
-#include "AT45.h"
-#include "PCAL9555.h"
-
-#include "can.h"
-#include "config_io.h"
-#include "ext_vars.h"
-#include "set_vars.h"
-
-#include "task_ob.h"
-
-#define CAN_BAUD 	50000	// скорость 
-#define UART_BAUD 	9600	// скорость 
-#define MAX_SERL  	30		// макс. длинна строки из usb/uart
-
-
-
-
-/*******  создание  локальных переменных *************************/
-
-int   	busin = 0; 	
-int   	t_sys = 0 ;	
-
-char  	pc_buffer [MAX_SERL+2];
-int   	pc_i=0;
-int   	pc_im=0;
-
-float	st_start=0.0;
-float	st_end=0.0;
-float	st_old=0.0; 
-float	st_cycl=0.0; 
-float	st_task=0.0; 
-
-int 	new_outs=0;
-
-/**********  прототипы локальных функций  **********************/
-void 	read_inputs(); 
-void 	write_outs();
-void    save_stat();
-void	logic_tasks();	
-void 	can_rw();
-void  	timers();
-void	pc_rd();
-int   	read_val(); 
-
-/**************  Threads  **************************************/
-Thread	read_uart; 
-Thread  work_can;	
-RtosTimer t_10msec(&logic_tasks); 
-
-
-/*************** старт программы  PLC **************************/
-int main()
-{
-	led=1;
-	st.start(); 
-	
-	// ----- настраиваем CAN  ------ 
-	can.frequency(CAN_BAUD);
-
-	//----- настраиваем порт USB  ------ 
-	pc.baud(UART_BAUD);
-	pc.printf( "\r\n> START PLC \r\n");
-	pc.printf(">CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
-
-
-	//------  проверка  FLASH  ----------
-	pc.printf("> flash size: %d bytes \n",  spif.device_size());
-	
-	
-	//-------  запускаем  потоки  Thread  ------
-	work_can.start(can_rw);	// обмен информ. по CAN
-    read_uart.start(pc_rd); // чтение UART
-	
-   
-    //--- запускаем логич.задач по таймеру  10msec ------
-    t_10msec.start(10); 		
-    
-
-	/***  обработка команд по USB  ***/
-    while (true) {
-		
-		if(t_sys<500){led=1;}else{led=0;}
-		led_r=led; 
-		
-		// проверяем usb
-       	if (pc_i>1 && pc_i==pc_im){            
-            pc_i = 0;
-            //pc.printf("usb:%s",pc_buffer);
-            //led = !led;
-            
-
-			// ---  устанавливаем значение  переменных ----
-            if(strstr(pc_buffer,"=")){
-				
-				if(strstr (pc_buffer,"vr000")) { vr000=read_val();  pc.printf( "ok\n"); }
-				if(strstr (pc_buffer,"vr001")) { vr001=read_val();  pc.printf( "ok\n"); }
-				if(strstr (pc_buffer,"vr002")) { vr002=read_val();  pc.printf( "ok\n"); }
-								
-				if(strstr (pc_buffer,"pr001")) { pr001=read_val();  pc.printf( "ok\n"); }
-				if(strstr (pc_buffer,"pr002")) { pr002=read_val();  pc.printf( "ok\n"); }
-				
-			}
-			
-			// ---  проверка значения  переменных ----- 
-            if(strstr(pc_buffer,"?")){
-				
-				if(strstr (pc_buffer,"vr000")) { pc.printf( "vr000:%d\n", vr000); }
-				if(strstr (pc_buffer,"vr001")) { pc.printf( "vr001:%d\n", vr001); }
-				if(strstr (pc_buffer,"vr002")) { pc.printf( "vr002:%d\n", vr002); }
-
-				if(strstr (pc_buffer,"pr001")) { pc.printf( "pr001:%d\n", pr001); }
-				if(strstr (pc_buffer,"pr002")) { pc.printf( "pr002:%d\n", pr002); }
-				
-				
-				//  для контроля состояния 
-				
-				if(strstr (pc_buffer,"dc_in"))  { pc.printf( "\n--- PLC --- \n> inputs:%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n", x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15,x16); }
-				if(strstr (pc_buffer,"dc_out")) { pc.printf( "\n--- PLC --- \n> outputs:%d%d%d%d%d%d%d%d%\n", y01,y02,y03,y04,y05,y06,y07,y08);  }
-				if(strstr (pc_buffer,"an_in"))  { pc.printf( "\n--- PLC --- \n> an_in1=%f an_in2=%f an_in3=%f an_in4=%f \n", Vin_1, Vin_2, Vin_3, Vin_4 ); }
-				if(strstr (pc_buffer,"an_out")) { pc.printf( "\n--- PLC --- \n> an_out1=%f an_out2=%f \n", Vout_1, Vout_2 ); }
-				if(strstr (pc_buffer,"stime"))  { pc.printf( "\n--- PLC --- \n> work cycle %f / using %f  sec \n", st_cycl, st_task ); }
-				
-				if(strstr (pc_buffer,"sm-1"))	{ pc.printf( "\n--- modul SM01 adr=1 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm1_pos, sm1_mov, sm1_alr, a101, a102, a103, a104, b101, b102 ); }
-				if(strstr (pc_buffer,"sm-2"))	{ pc.printf( "\n--- modul SM01 adr=2 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm2_pos, sm2_mov, sm2_alr, a201, a202, a203, a204, b201, b202 ); }
-				if(strstr (pc_buffer,"sm-3"))	{ pc.printf( "\n--- modul SM01 adr=3 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm3_pos, sm3_mov, sm3_alr, a301, a302, a303, a304, b301, b302 ); }
-				if(strstr (pc_buffer,"sm-4"))	{ pc.printf( "\n--- modul SM01 adr=4 --- \n> car position-%d  moving-%d  alarm-%d \n> inputs %d-%d-%d-%d  outputs %d-%d \n", sm4_pos, sm4_mov, sm4_alr, a401, a402, a403, a404, b401, b402 ); }
-				
-				if(strstr (pc_buffer,"dm-1"))	{ pc.printf( "\n--- modul DM0806  adr=1 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x101,x102,x103,x104,x105,x106,x107,x108, y101,y102,y103,y104,y105,y106 ); }
-				if(strstr (pc_buffer,"dm-2"))	{ pc.printf( "\n--- modul DM0806  adr=2 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x201,x202,x203,x204,x205,x206,x207,x208, y201,y202,y203,y204,y205,y206 ); }
-				if(strstr (pc_buffer,"dm-3"))	{ pc.printf( "\n--- modul DM0806  adr=3 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x301,x302,x303,x304,x305,x306,x307,x308, y301,y302,y303,y304,y305,y306 ); }
-				if(strstr (pc_buffer,"dm-4"))	{ pc.printf( "\n--- modul DM0806  adr=4 --- \n> inputs:%d%d%d%d%d%d%d%d%  \n> outputs:%d%d%d%d%d%d% \n", x401,x402,x403,x404,x405,x406,x407,x408, y401,y402,y403,y404,y405,y406 ); }
-				
-			}
-			
-			if(strstr (pc_buffer,"reset")) { NVIC_SystemReset() ; }
-			
-			
-
-		 } 
-
-		pc_im=pc_i; 
-        Thread::wait(100);
-    }
-    
-}
-
-
-/****************  дополнительные  функции  **********************/
-
-// логические  задачи.  вызываются для выполнения
-// каждые 10 мсек
-void logic_tasks(){
-	// чтение сист.таймера
-	st_start=st.read();
-	
-	
-	// подготовка входн.информации
-	timers();        
-	read_inputs();
-	
-	// логичкские задачи
-	task_ob(); 
-	
-	// формирование выходн.информации
-	write_outs(); 
-	save_stat();
-	
-	// определяем реальное время цикла/использ.время
-	st_end=st.read();
-	st_task=st_end-st_start;
-	st_cycl=st_start-st_old;
-	st_old=st_start;
-
-}
-
-
-//----------------------------------------
-// установка   выходов  контроллера
-// в соответствии  значения преременным
-void write_outs(){
-	// устанавливаем локальные выходы ПЛК
-	y_1=y01;	y_5=y05;
-	y_2=y02;	y_6=y06;
-	y_3=y03;	y_7=y07;
-	y_4=y04;	y_8=y08; 
-	
-	anout1=Vout_1;
-    anout2=Vout_2;
-    
-	//  упаковываем  выходы для DM0806 ADR=1 
-	dm1_outs = 0;
-	if(y106==1){dm1_outs = dm1_outs |1;}		// y106
-	dm1_outs = dm1_outs << 1; 
-	if(y105==1){dm1_outs = dm1_outs |1;}		// y105
-	dm1_outs = dm1_outs << 1; 
-	if(y104==1){dm1_outs = dm1_outs |1;}		// y104
-	dm1_outs = dm1_outs << 1; 
-	if(y103==1){dm1_outs = dm1_outs |1;}		// y103
-	dm1_outs = dm1_outs << 1;
-	if(y102==1){dm1_outs = dm1_outs |1;}		// y102
-	dm1_outs = dm1_outs << 1;
-	if(y101==1){dm1_outs = dm1_outs |1;}		// y101
-	
-	//  упаковываем  выходы для DM0806 ADR=2
-	dm2_outs = 0;
-	if(y206==1){dm2_outs = dm2_outs |1;}		// y206
-	dm2_outs = dm2_outs << 1; 
-	if(y205==1){dm2_outs = dm2_outs |1;}		// y205
-	dm2_outs = dm2_outs << 1; 
-	if(y204==1){dm2_outs = dm2_outs |1;}		// y204
-	dm2_outs = dm2_outs << 1; 
-	if(y203==1){dm2_outs = dm2_outs |1;}		// y203
-	dm2_outs = dm2_outs << 1;
-	if(y202==1){dm2_outs = dm2_outs |1;}		// y202
-	dm2_outs = dm2_outs << 1;
-	if(y201==1){dm2_outs = dm2_outs |1;}		// y201
-	
-	//  упаковываем  выходы для DM0806 ADR=3
-	dm3_outs = 0;
-	if(y306==1){dm3_outs = dm3_outs |1;}		// y306
-	dm3_outs = dm3_outs << 1; 
-	if(y305==1){dm3_outs = dm3_outs |1;}		// y305
-	dm3_outs = dm3_outs << 1; 
-	if(y304==1){dm3_outs = dm3_outs |1;}		// y304
-	dm3_outs = dm3_outs << 1; 
-	if(y303==1){dm3_outs = dm3_outs |1;}		// y303
-	dm3_outs = dm3_outs << 1;
-	if(y302==1){dm3_outs = dm3_outs |1;}		// y302
-	dm3_outs = dm3_outs << 1;
-	if(y301==1){dm3_outs = dm3_outs |1;}		// y301
-	
-	
-	//  упаковываем  выходы для DM0806 ADR=4
-	dm4_outs = 0;
-	if(y406==1){dm4_outs = dm4_outs |1;}		// y406
-	dm4_outs = dm4_outs << 1; 
-	if(y405==1){dm4_outs = dm4_outs |1;}		// y405
-	dm4_outs = dm4_outs << 1; 
-	if(y404==1){dm4_outs = dm4_outs |1;}		// y404
-	dm4_outs = dm4_outs << 1; 
-	if(y403==1){dm4_outs = dm4_outs |1;}		// y403
-	dm4_outs = dm4_outs << 1;
-	if(y402==1){dm4_outs = dm4_outs |1;}		// y402
-	dm4_outs = dm4_outs << 1;
-	if(y401==1){dm4_outs = dm4_outs |1;}		// y401	
-	
-	
-	// при изменении по DM0806 посылаем в CAN
-    if(dm1_outs!=mdm1_outs || dm2_outs!=mdm2_outs || dm3_outs!=mdm3_outs || dm4_outs!=mdm4_outs){
-		int  _id=50;
-		char _b1= dm1_outs;
-		char _b2= dm2_outs ;
-		char _b3= dm3_outs ;
-		char _b4= dm4_outs ;
-		can_save_wr(_id,_b1,_b2,_b3,_b4);
-	}
-	
-	
-	//  упаковываем  выходы для SM01 ADR=1-4 
-	sm_outs=0; 
-	if(b402==1){sm_outs = sm_outs |1;}			// b402
-	sm_outs = sm_outs << 1;		
-	if(b401==1){sm_outs = sm_outs |1;}			// b401
-	sm_outs = sm_outs << 1;		
-	if(b302==1){sm_outs = sm_outs |1;}			// b302
-	sm_outs = sm_outs << 1;		
-	if(b301==1){sm_outs = sm_outs |1;}			// b301
-	sm_outs = sm_outs << 1;		
-	if(b202==1){sm_outs = sm_outs |1;}			// b202
-	sm_outs = sm_outs << 1;		
-	if(b201==1){sm_outs = sm_outs |1;}			// b201
-	sm_outs = sm_outs << 1;		
-	if(b102==1){sm_outs = sm_outs |1;}			// b102
-	sm_outs = sm_outs << 1;		
-	if(b101==1){sm_outs = sm_outs |1;}			// b101
-
-    
-    // при изменении по SM01 посылаем в CAN
-    if(sm_outs != msm_outs  ||  sm_position != msm_position){
-		int  _id=60;
-		char _b1=dm1_outs;
-		char _b2= sm_position / 100 ;
-		char _b3= (sm_position - _b2*100) / 10  ;
-		char _b4= (sm_position - _b2*100 - _b3*10)  ;
-		can_save_wr(_id,_b1,_b2,_b3,_b4);
-	}
-    
-
-}
-
-
-//----------------------------------------
-// формирование  значения  переменных
-// в соответствии  с  сигналами на  входах контроллера
-// и  принятой по CAN информацией
-void read_inputs(){
-	// считываем локальные выходы ПЛК
-    busin=inps;       
-    if(busin & 1){ x01=0; }else{ x01=1;}
-	if(busin & 2){ x02=0; }else{ x02=1;}
-	if(busin & 4){ x03=0; }else{ x03=1;}
-	if(busin & 8){ x04=0; }else{ x04=1;}
-	if(busin & 16){ x05=0; }else{ x05=1;}
-	if(busin & 32){ x06=0; }else{ x06=1;}
-	if(busin & 64){ x07=0; }else{ x07=1;}
-	if(busin & 128){ x08=0; }else{ x08=1;}
-	if(busin & 256){ x09=0; }else{ x09=1;}
-	if(busin & 512){ x10=0; }else{ x10=1;}
-	if(busin & 1024){ x11=0; }else{ x11=1;}
-	if(busin & 2048){ x12=0; }else{ x12=1;}
-	if(busin & 4096){ x13=0; }else{ x13=1;}
-	if(busin & 8192){ x14=0; }else{ x14=1;}
-	if(busin & 16384){ x15=0; }else{ x15=1;}
-	if(busin & 32768){ x16=0; }else{ x16=1;}
-	
-	Vin_1 =  aninp1;
-    Vin_2 =  aninp2;
-    Vin_3 =  aninp3;
-    Vin_4 =  aninp4;
-    
-    // проверяем принятые посылки CAN
-	int resalt=1;
-	while(resalt==1){
-		resalt=can_select_rd();
-		if(resalt==1){
-			
-			//  inps from DM ADR=1
-			if(r_id==51){
-				if( r_b1&1    ){ x101=1; } else { x101=0; }
-				if((r_b1>>1)&1){ x102=1; } else { x102=0; }
-				if((r_b1>>2)&1){ x103=1; } else { x103=0; }
-				if((r_b1>>3)&1){ x104=1; } else { x104=0; }
-				if((r_b1>>4)&1){ x105=1; } else { x105=0; }
-				if((r_b1>>5)&1){ x106=1; } else { x106=0; }
-				if((r_b1>>6)&1){ x107=1; } else { x107=0; }
-				if((r_b1>>7)&1){ x108=1; } else { x108=0; }
-			}
-			
-			//  inps from DM ADR=2
-			if(r_id==52){
-				if( r_b1&1    ){ x201=1; } else { x201=0; }
-				if((r_b1>>1)&1){ x202=1; } else { x202=0; }
-				if((r_b1>>2)&1){ x203=1; } else { x203=0; }
-				if((r_b1>>3)&1){ x204=1; } else { x204=0; }
-				if((r_b1>>4)&1){ x205=1; } else { x205=0; }
-				if((r_b1>>5)&1){ x206=1; } else { x206=0; }
-				if((r_b1>>6)&1){ x207=1; } else { x207=0; }
-				if((r_b1>>7)&1){ x208=1; } else { x208=0; }
-			}
-			
-			//  inps from DM ADR=3
-			if(r_id==53){
-				if( r_b1&1    ){ x301=1; } else { x301=0; }
-				if((r_b1>>1)&1){ x302=1; } else { x302=0; }
-				if((r_b1>>2)&1){ x303=1; } else { x303=0; }
-				if((r_b1>>3)&1){ x304=1; } else { x304=0; }
-				if((r_b1>>4)&1){ x305=1; } else { x305=0; }
-				if((r_b1>>5)&1){ x306=1; } else { x306=0; }
-				if((r_b1>>6)&1){ x307=1; } else { x307=0; }
-				if((r_b1>>7)&1){ x308=1; } else { x308=0; }
-			}
-			
-			//  inps from DM ADR=4
-			if(r_id==54){
-				if( r_b1&1    ){ x401=1; } else { x401=0; }
-				if((r_b1>>1)&1){ x402=1; } else { x402=0; }
-				if((r_b1>>2)&1){ x403=1; } else { x403=0; }
-				if((r_b1>>3)&1){ x404=1; } else { x404=0; }
-				if((r_b1>>4)&1){ x405=1; } else { x405=0; }
-				if((r_b1>>5)&1){ x406=1; } else { x406=0; }
-				if((r_b1>>6)&1){ x407=1; } else { x407=0; }
-				if((r_b1>>7)&1){ x408=1; } else { x408=0; }
-			}
-			
-			//  inps from SM ADR=1
-			if(r_id==61){
-				if(r_b1 & 4) { a101=1; } else{ a101=0; }
-				if(r_b1 & 8) { a102=1; } else{ a102=0; }
-				if(r_b1 & 16){ a103=1; } else{ a103=0; }
-				if(r_b1 & 32){ a104=1; } else{ a104=0; }
-				if(r_b1 & 64){  sm1_mov=1; }  else{ sm1_mov=0; }
-				if(r_b1 & 128){ sm1_alr=1; }  else{ sm1_alr=0; }
-				sm1_pos = r_b2*100+r_b3*10+r_b4;
-			}
-			
-			//  inps from SM ADR=2
-			if(r_id==62){
-				if(r_b1 & 4) { a201=1; } else{ a201=0; }
-				if(r_b1 & 8) { a202=1; } else{ a202=0; }
-				if(r_b1 & 16){ a203=1; } else{ a203=0; }
-				if(r_b1 & 32){ a204=1; } else{ a204=0; }
-				if(r_b1 & 64){  sm2_mov=1; }  else{ sm2_mov=0; }
-				if(r_b1 & 128){ sm2_alr=1; }  else{ sm2_alr=0; }
-				sm2_pos = r_b2*100+r_b3*10+r_b4;
-			}
-			
-			//  inps from SM ADR=3
-			if(r_id==63){
-				if(r_b1 & 4) { a301=1; } else{ a301=0; }
-				if(r_b1 & 8) { a302=1; } else{ a302=0; }
-				if(r_b1 & 16){ a303=1; } else{ a303=0; }
-				if(r_b1 & 32){ a304=1; } else{ a304=0; }
-				if(r_b1 & 64){  sm3_mov=1; }  else{ sm3_mov=0; }
-				if(r_b1 & 128){ sm3_alr=1; }  else{ sm3_alr=0; }
-				sm3_pos = r_b2*100+r_b3*10+r_b4;
-			}
-			
-			//  inps from SM ADR=4
-			if(r_id==64){
-				if(r_b1 & 4) { a401=1; } else{ a401=0; }
-				if(r_b1 & 8) { a402=1; } else{ a402=0; }
-				if(r_b1 & 16){ a403=1; } else{ a403=0; }
-				if(r_b1 & 32){ a404=1; } else{ a404=0; }
-				if(r_b1 & 64){  sm4_mov=1; }  else{ sm4_mov=0; }
-				if(r_b1 & 128){ sm4_alr=1; }  else{ sm4_alr=0; }
-				sm4_pos = r_b2*100+r_b3*10+r_b4;
-			}
-
-
-
-		}
-	}
-    
-}
-
-//----------------------------------------
-//  сохранение значения переменных  для  обработки
-//  в  след.цикле  (установка, сброс)
-void save_stat(){
-	
-	mx01=x01;	mx02=x02;	mx03=x03;	mx04=x04;    
-	mx05=x05;	mx06=x06;	mx07=x07;	mx08=x08;    
-	mx09=x09;	mx10=x10;	mx11=x11;	mx12=x12;    
-	mx13=x13;	mx14=x14;	mx15=x15;	mx16=x16;
-	my01=y01;	my02=y02;	my03=y03;	my04=y04;    
-	my05=y05;	my06=y06;	my07=y07;	my08=y08;  	
-	
-	mx101=x101;	mx102=x102;	mx103=x103;	mx104=x104;    
-	mx105=x105;	mx106=x106;	mx107=x107;	mx108=x108; 
-	mx201=x201;	mx202=x202;	mx203=x103;	mx204=x104;    
-	mx205=x205;	mx206=x206;	mx207=x107;	mx208=x108;
-	mx301=x301;	mx302=x302;	mx303=x303;	mx304=x304;    
-	mx305=x305;	mx306=x306;	mx307=x307;	mx308=x308;
-	mx401=x401;	mx402=x402;	mx403=x403;	mx404=x404;    
-	mx405=x405;	mx406=x406;	mx407=x407;	mx408=x408;
-	my101=y101;	my102=y102;	my103=y103;	    
-	my104=y104; my105=y105;	my106=y106;	
-	my201=y201;	my202=y202;	my203=y203;	    
-	my204=y204; my205=y205;	my206=y206;	
-	my301=y301;	my302=y302;	my303=y303;	    
-	my304=y304; my305=y305;	my306=y306;	
-	my401=y401;	my402=y402;	my403=y403;	   
-	my404=y404; my405=y405;	my406=y406;	
-	
-	ma101=a101; ma102=a102; ma103=a103; ma104=a104;
-	ma201=a201; ma202=a202; ma203=a203; ma204=a204;
-	ma301=a301; ma302=a302; ma303=a303; ma304=a304;
-	ma401=a401; ma402=a402; ma403=a403; ma404=a404;
-	mb101=b101; mb102=b102; mb201=b201; mb202=b202;
-	mb301=b301; mb302=b302; mb401=b401; mb402=b402;
-	
-	msm_outs=sm_outs;
-	msm_position=sm_position;
-	
-	mdm1_outs=dm1_outs; 
-	mdm2_outs=dm2_outs; 
-	mdm3_outs=dm3_outs; 
-	mdm4_outs=dm4_outs; 
-	
-	
-	
-}
-
-//----------------------------------------
-//  изменение значения  секундных  и  милисекундных  таймеров 
-//  (дискретность 10 мсек)
-void timers(){
-	
-	int i = 10 ;  		// время цикла в 10мсек
-	int max1=30000;		// макс. значение  для мсек таймеров (30мин)
-	int max2=18000;		// макс. значение для сек  таймеров   (5час)
-	
-	// timers,  10ms
-	if(t_sys<1000){
-		t_sys=t_sys+i;
-	}else{
-		t_sys = 0;
-		if(t101<max2){t101=t101+1;}
-		if(t102<max2){t102=t102+1;}
-		if(t103<max2){t103=t103+1;}
-		if(t104<max2){t104=t104+1;}
-		if(t105<max2){t105=t105+1;}
-		if(t106<max2){t106=t106+1;}
-		if(t107<max2){t107=t107+1;}
-		if(t108<max2){t108=t108+1;}
-		if(t109<max2){t109=t109+1;}
-		if(t110<max2){t110=t110+1;}
-	}
-	
-	if(t01<max1){t01=t01+i;}
-	if(t02<max1){t02=t02+i;}
-	if(t03<max1){t03=t03+i;}
-	if(t04<max1){t04=t04+i;}
-	if(t05<max1){t05=t05+i;}
-	if(t06<max1){t06=t06+i;}
-	if(t07<max1){t07=t07+i;}
-	if(t08<max1){t08=t08+i;}
-	if(t09<max1){t09=t09+i;}
-	if(t10<max1){t10=t10+i;}
-	
-}
-
-//----------------------------------------
-// прием  и  отправка  посылок   
-// по  CAN  шине
-void can_rw()
-{
-	CANMessage msg_w;     	 
-	CANMessage msg_r;
-	
-	for(int i=0; i<=10; i++){ r_mess_id[i]=0; w_mess_id[i]=0; }
-	for(int i=0; i<=40; i++){ r_mess_data[i]=0; w_mess_data[i]=0; }
-	
-       
-	while (true){
-		
-		// проверяем, если есть новая посылка 
-		// то помещаем в очередь  can_save_rd()
-		if(can.read(msg_r)){
-			int  id = msg_r.id;
-			char b1 = msg_r.data[0];
-			char b2 = msg_r.data[1];
-			char b3 = msg_r.data[2];
-			char b4 = msg_r.data[3];
-			can_save_rd(id,b1,b2,b3,b4);
-			led_b = !led_b;
-		}
-
-		
-		// проверяем очередь на отправку  can_select_wr()
-		// и если есть , то отправляем  
-		if(can_select_wr()){
-			msg_w.len = 4;
-			msg_w.id 	  = w_id;	
-			msg_w.data[0] = w_b1;
-			msg_w.data[1] = w_b2;
-			msg_w.data[2] = w_b3;
-			msg_w.data[3] = w_b4;
-			can.write(msg_w);
-			
-			if(can.tderror()){ led_b = !led_b; w_alr=1; } else { w_alr=0; }
-			
-		}
-		
-		
-		Thread::wait(2);
-	}
-        
-}
-
-//----------------------------------------
-// посимвольный прием из USB и  сохранение  
-// информации в буфере, обрабатывается после того как все принято
-void pc_rd()
-{
-	sprintf(pc_buffer, "buff_ok");
-	while(1) 
-	{
-		if( pc.readable() )
-		{
-			pc_buffer[pc_i] = pc.getc();
-			if(pc_i<MAX_SERL){pc_i++; }
-			pc_buffer[pc_i]=0; 
-		}
-	}
-}
-
-//----------------------------------------
-// поиск и чтение  значения  из  строки 
-// возвращает целое число. 
-int   read_val() {
-	char  	inp_c[10];
-	int   	val=0;
-	int   	i=0;
-	int   	p=0;
-	
-	while(p<MAX_SERL){	
-		if(pc_buffer[p]=='='){ break ; }
-		p++; 
-	}
-	
-	p++;
-	i=0; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
-	i=1; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
-	i=2; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
-	i=3; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
-	i=4; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
-	i=5; if(pc_buffer[p+i]>=48 && pc_buffer[p+i]<=57){ inp_c[i]=pc_buffer[p+i]; } else {inp_c[i]=0 ; }
-	inp_c[6]=0 ;
-	
-	val = atoi(inp_c);
-	return  val;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/set_vars.h
--- a/src/set_vars.h	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,251 +0,0 @@
-  
- /*******   inp-out PLC  ************************************/
-  
-int x01=0;		int mx01=0; 
-int x02=0;		int mx02=0; 
-int x03=0;		int mx03=0; 
-int x04=0;		int mx04=0; 
-int x05=0;		int mx05=0; 
-int x06=0;		int mx06=0; 
-int x07=0;		int mx07=0; 
-int x08=0;		int mx08=0; 
-int x09=0;		int mx09=0; 
-int x10=0;		int mx10=0; 
-int x11=0;		int mx11=0; 
-int x12=0;		int mx12=0; 
-int x13=0;		int mx13=0; 
-int x14=0;		int mx14=0; 
-int x15=0;		int mx15=0; 
-int x16=0;		int mx16=0; 
-
-
-int y01=0;		int my01=0; 
-int y02=0;		int my02=0; 
-int y03=0;		int my03=0; 
-int y04=0;		int my04=0; 
-int y05=0;		int my05=0; 
-int y06=0;		int my06=0; 
-int y07=0;		int my07=0; 
-int y08=0;		int my08=0; 
-
-
-float 	Vin_1=0.0; 
-float 	Vin_2=0.0; 
-float 	Vin_3=0.0;
-float 	Vin_4=0.0;  
-
-float 	Vout_1=0.0; 
-float 	Vout_2=0.0; 
-
-
-int  r_mess_id[10];		int  	w_mess_id[10];
-char r_mess_data[40];	char 	w_mess_data[40];
-
-int  r_id=0 ;			int  w_id=0 ;
-char r_b1=0 ;			char w_b1=0 ;
-char r_b2=0 ;			char w_b2=0 ;
-char r_b3=0 ;			char w_b3=0 ;
-char r_b4=0 ;			char w_b4=0 ;
-						int  w_alr=0 ; 
-
-
-
-/******************  DM0806  moduls *********************************/
-
-// ----- adr 1 ---------
-char dm1_outs=0;
-char mdm1_outs=0;
-
-int x101=0;		int mx101=0; 
-int x102=0;		int mx102=0; 
-int x103=0;		int mx103=0; 
-int x104=0;		int mx104=0; 
-int x105=0;		int mx105=0; 
-int x106=0;		int mx106=0; 
-int x107=0;		int mx107=0; 
-int x108=0;		int mx108=0; 
-
-int y101=0;		int my101=0; 
-int y102=0;		int my102=0; 
-int y103=0;		int my103=0; 
-int y104=0;		int my104=0; 
-int y105=0;		int my105=0; 
-int y106=0;		int my106=0; 
-
-
-// ----- adr 2 ---------
-char dm2_outs=0;
-char mdm2_outs=0;
-
-int x201=0;		int mx201=0; 
-int x202=0;		int mx202=0; 
-int x203=0;		int mx203=0; 
-int x204=0;		int mx204=0; 
-int x205=0;		int mx205=0; 
-int x206=0;		int mx206=0; 
-int x207=0;		int mx207=0; 
-int x208=0;		int mx208=0; 
-
-int y201=0;		int my201=0; 
-int y202=0;		int my202=0; 
-int y203=0;		int my203=0; 
-int y204=0;		int my204=0; 
-int y205=0;		int my205=0; 
-int y206=0;		int my206=0; 
-
-// ----- adr 3 ---------
-char dm3_outs=0;
-char mdm3_outs=0;
-
-int x301=0;		int mx301=0; 
-int x302=0;		int mx302=0; 
-int x303=0;		int mx303=0; 
-int x304=0;		int mx304=0; 
-int x305=0;		int mx305=0; 
-int x306=0;		int mx306=0; 
-int x307=0;		int mx307=0; 
-int x308=0;		int mx308=0; 
-
-int y301=0;		int my301=0; 
-int y302=0;		int my302=0; 
-int y303=0;		int my303=0; 
-int y304=0;		int my304=0; 
-int y305=0;		int my305=0; 
-int y306=0;		int my306=0; 
-
-// ----- adr 4 ---------
-char dm4_outs=0;
-char mdm4_outs=0;
-
-int x401=0;		int mx401=0; 
-int x402=0;		int mx402=0; 
-int x403=0;		int mx403=0; 
-int x404=0;		int mx404=0; 
-int x405=0;		int mx405=0; 
-int x406=0;		int mx406=0; 
-int x407=0;		int mx407=0; 
-int x408=0;		int mx408=0; 
-
-int y401=0;		int my401=0; 
-int y402=0;		int my402=0; 
-int y403=0;		int my403=0; 
-int y404=0;		int my404=0; 
-int y405=0;		int my405=0; 
-int y406=0;		int my406=0; 
-
-
-/******************** for  SM01  moduls *****************************/
-int	 sm_position=0;
-char sm_outs =0;
-
-int	 msm_position=0;
-char msm_outs =0;
-
- // ----- adr 1  ---------
-int sm1_pos=0;
-int sm1_mov=0;
-int sm1_alr=0;
-
-int a101=0;		int ma101=0;
-int a102=0;		int ma102=0;
-int a103=0;		int ma103=0;
-int a104=0;		int ma104=0;
-
-int b101=0;		int mb101=0;
-int b102=0;		int mb102=0;
-
-
-// ----- adr 2  ---------
-int sm2_pos=0;
-int sm2_mov=0;
-int sm2_alr=0;
-
-int a201=0;		int ma201=0;
-int a202=0;		int ma202=0;
-int a203=0;		int ma203=0;
-int a204=0;		int ma204=0;
-
-int b201=0;		int mb201=0;
-int b202=0;		int mb202=0;
- 
- 
- // ----- adr 3  ---------
-int sm3_pos=0;
-int sm3_mov=0;
-int sm3_alr=0;
-
-int a301=0;		int ma301=0;
-int a302=0;		int ma302=0;
-int a303=0;		int ma303=0;
-int a304=0;		int ma304=0;
-
-int b301=0;		int mb301=0;
-int b302=0;		int mb302=0;
-  
-  
- // ----- adr 4  ---------
-int sm4_pos=0;
-int sm4_mov=0;
-int sm4_alr=0;
-
-int a401=0;		int ma401=0;
-int a402=0;		int ma402=0;
-int a403=0;		int ma403=0;
-int a404=0;		int ma404=0;
-
-int b401=0;		int mb401=0;
-int b402=0;		int mb402=0;
-
-
-
-/***************  for user *******************************************/
-
-// ------------------------
-int t01=0;		int t101=0;
-int t02=0;		int t102=0;
-int t03=0;		int t103=0;
-int t04=0;		int t104=0;
-int t05=0;		int t105=0;
-int t06=0;		int t106=0;
-int t07=0;		int t107=0;
-int t08=0;		int t108=0;
-int t09=0;		int t109=0;
-int t10=0;		int t110=0;
-
-
-// ---------------------------
-int vr000 = 0 ; 
-int vr001 = 2 ; 
-int vr002 = 0 ; 
-int vr003 = 0 ; 
-int vr004 = 0 ; 
-int vr005 = 0 ; 
-int vr007 = 0 ; 
-int vr008 = 0 ; 
-int vr009 = 0 ; 
-int vr010 = 0 ; 
-int vr011 = 0 ; 
-int vr012 = 0 ; 
-int vr013 = 0 ; 
-
-int pr001 = 0 ; 
-int pr002 = 0 ; 
-
-int al001 = 0 ;
-int al002 = 1 ;
-int al003 = 1 ;
-int al004 = 0 ;
-int al005 = 0 ;
-int al006 = 0 ;
-int al007 = 0 ;
-int al008 = 0 ;
-int al009 = 0 ;
-int al010 = 0 ;
-int al011 = 0 ;
-int al012 = 0 ;
-int al013 = 0 ;
-int al014 = 0 ;
-
-
-
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/task_ob.h
--- a/src/task_ob.h	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-#ifndef TASK_OB_H
-#define TASK_OB_H
-int task_ob();
-#endif
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/task_pb1.h
--- a/src/task_pb1.h	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-#ifndef TASK_PB1_H
-#define TASK_PB1_H
-int task_pb1();
-#endif
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/task_pb2.h
--- a/src/task_pb2.h	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-#ifndef TASK_PB2_H
-#define TASK_PB2_H
-int task_pb2();
-#endif
-
diff -r 3768b56b12e7 -r 439534d6bb89 src/task_pb3.h
--- a/src/task_pb3.h	Mon Feb 08 05:14:32 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-#ifndef TASK_PB3_H
-#define TASK_PB3_H
-int task_pb3();
-#endif
-