2021年4月30日 星期五

ESP8266與PLC通訊

目的:測試ESP8266 軟體RS232與PLC通訊

系統架構


線路

DB9腳位定義:

 pin2(RX)

 pin3(TX)

 pin5(GND) 

DB9連接線 2,3腳已跳線





ESP8266 Pin

TTL (Pin) – RS232(DB9)

DVP PLC COM1 (BD9)

GPIO 4 (D2, RX)

TX

2 (RX)

2 (RX)

GPIO 0 (D3, TX)

RX

3 (TX)

3 (TX)

3.3 VCC

VCC

5 (GND)

5(GND)

GND

GND

 

 


程式 

#include <SoftwareSerial.h>

#define D2 (4) //RX

#define D3 (0) //TX

SoftwareSerial swSer;

char CR = 0x0D;

char LF = 0x0A;

String cmd = String();

byte inByte[50] ; // 用來儲存收進來的 data byte

int i=0;

boolean once = false;

void setup()                    // run once, when the sketch starts

  Serial.begin(115200);

  swSer.begin(9600, SWSERIAL_7E1, D2, D3);     // DVP PLC Modbus ASCII 9600,7,e,1 

 // force Y0 ON ":01050500FF00F6\r\n" 

  cmd= cmd + ":01050500FF00F6" + CR + LF;

}

void loop() {                

  if(!once){

   Serial.println(" "); 

   Serial.println("ESP8266 --> DVP PLC");

   Serial.print(cmd);  //print string 

   for(int i=0; i<cmd.length(); i++) { //print ascii code

    Serial.print(cmd.charAt(i),HEX);

    Serial.print(" ");

  }  

    swSer.print(cmd); //Arduino 2 PLC 

    delay(100); 

    Serial.println(" ");

   Serial.println(" ");

 // PLC Response

 i=0;

 while (swSer.available()) { //PLC 2 ESP8266

    inByte[i++] = swSer.read();      

  }   

  Serial.println("DVP PLC --> ESP8266");  

  for(int j=0; j< i;j++)   

    Serial.print((char) inByte[j]);    

  for(int j=0; j< i;j++){

    Serial.print(inByte[j],HEX);

    Serial.print(" ");

  } 

  Serial.println(" ");  

 i=0;

 once = true;

  }//end once 

}

結果


ESP_XX 通訊函式庫

SoftwareSerial for ESP XX



2021年4月25日 星期日

PLC ST語言編碼總結

  •  組合邏輯

  1. 布林代數
  2. IF ......THEN...... ELSE.......END_IF;

例:



Y0.0 := ( X0.0 OR NOT X0.2) 

     AND  ( NOT X0.1 OR X0.3);

Y0.1 := ( X0.4 AND NOT X0.6) 

        OR   ( NOT X0.5 AND X0.7);


IF  ( X0.0 OR NOT X0.2)  AND  ( NOT X0.1 OR X0.3)  THEN

      Y0.0 := TRUE; 

ELSE

     Y0.0 := FALSE;

END_IF;

  • 順序邏輯

  1. IF .......THEN.........END_IF;

例:



IF X0.0 THEN

    Y0.0 := TRUE;

END_IF; 


IF X0.1 THEN

    Y0.0 := FALSE;

END_IF;


  •  SFC(順序功能圖)
  1. CASE.....OF
           1: ..........;
           2:..........;
        ELSE
              .............;
        END_CASE;




(* A+ A- 雙邊電磁閥 *)


(* state output *)
svA1 := (state = 1);  (* output svA+ *)
svA0 := (state = 2);  (* output svA- *)

(* next state *)
CASE state OF
    0: (* S0 *)        
        IF pbStart THEN (* next state *)
            state := 1;        
        END_IF;        
    1:  (* A+ *)        
        IF lsA1 THEN    (* next state *)
            state := 2;        
        END_IF;        
    2:  (* A- *)        
        IF lsA0 THEN    (* next state *)
            state := 0;        
        END_IF;
    ELSE
       state := 0;
END_CASE;



2021年4月10日 星期六

PLC 結構化語言編碼

使用結構化語言(Structured Text,ST)描述PLC基本順序指令

LD LDI OUT 


SET RST
























 

AND ANI OR ORI


















































ANB ORB 




















PLS PLF
































































 MC MCR


MPS MRD MPP





















NOP INV




































TMR






























































CNT