PLC S7 从属 ARDUINO 7- (多节点)

 WinAC RTX PLC 项目与基于 ARDUINO 的从属 I/O 节点进行通信。

 这是PLC软件类别的第七个条目,这次我展示了一个完整的项目,其中不同的从从基于Arduino和SIEMENS WinAc RTX PLC通信。

 该项目是PLC软件类别以前的条目的汇编和扩展。

 这一次,我们将有PLC安装在便携式PC与STEP7编程环境和三个分散输入/输出卡,其中之一wifi。

7.1- 第一张卡基于个人 Arduino PLC 项目,该项目在以前的条目中详细说明,您已向该项目添加了以太网通信卡。

7.2-第二张卡基于流行的Arduino UNO和W5100以太网屏蔽。

7.3-第三张卡基于ESP8266控制器,在以前的条目中已经讨论过。

 它基于带有 Wifi 通信的处理器,具有中继输出和光耦合输入。

7.4-STEP-7 程序 (PLC 西门子), 是 PLC 程序,其中解释配置,以便能够从 Arduinos 从站到 PLC 交换信息。

  对于以太网链路,我使用了连接有线和 Wifi 节点的旧路由器。但我没有详细说明路由器的配置,因为有很多关于它的信息,它因每个型号而异。

 7.1 基 I/O 卡(PLC Arduino)

 此条目是 ARDUINO PLC 条目的延续,其中说明了如何创建 DiY PLC。

 我们将简单地为PLC硬件配备基于W5100控制器的以太网卡。

 

 为了促进项目的实现,我在主要的在线销售平台上使用了开故障以太网硬件。

  正如最初设计中已经设想的那样,我们只需通过 10 路扁平电缆连接 PCU 和以太网卡。然后,我们机箱,以适应新卡。

 

 通过这个简单的修改,我们现在只需加载 Arduino 程序,将 Arduino PLC 变成西门子 PLC 的从站,因此它是一个 8 位从卡的光电输入和 4 位输出中继。

 我们的计划:

   我们运行 Arduino V1.8.7 编程环境。我们介绍程序。以前,我们必须下载库(Settimino),该库将西门子的通信协议纳入我们的 Arduino 项目。

/*----------------------------------------------------------------------
 Modulo IO Arduino 8 Inputs 4 Outputs
 Compilado con Arduino IDE 1.8.7
 JColl Jul.2019
----------------------------------------------------------------------*/
#define E0_0   A0   // Nº de Pin entrada digital.
#define E0_1   A1   // Nº de Pin entrada digital.
#define E0_2   A2   // Nº de Pin entrada digital.
#define E0_3   A3   // Nº de Pin entrada digital.
#define E0_6   8    // Nº de Pin entrada digital.
#define E0_7   7    // Nº de Pin entrada digital. 

//Estas dos entradas son analógicas y se deben tratar de tal forma
#define E0_4   A6   // Pin correspondiente a la entrada Analógica.
#define E0_5   A7   // Pin correspondiente a la entrada Analógica. 
#define A0_0   3    // Nº de Pin Salida digital.
#define A0_1   4    // Nº de Pin Salida digital.
#define A0_2   5    // Nº de Pin Salida digital.
#define A0_3   6    // Nº de Pin Salida digital.

void software_Reset(){   asm volatile ("  jmp 0");  } 
void(* resetFunc) (void) = 0; //declare reset function at address 0

#include <SPI.h>
#include <Ethernet.h>
#include "Settimino.h"

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x08, 0xE1};

IPAddress Local(192,168,1,45); // Local Address
IPAddress PLC(192,168,1,51);   // PLC Address
IPAddress Subnet(255,255,255,0);
int intentos =5; //Intentos de comunicar antes de hacer reset.

int DBNum = 1; // This DB must be present in your PLC
byte Buffer[8];
int Nodo = 1; // Indicar aqui el número de Nodo de la tarjeta (1-25)

S7Client Client(_S7WIRED);

unsigned long Elapsed; // To calc the execution time
//----------------------------------------------------------------------
// Setup : Init Ethernet and Serial port
//----------------------------------------------------------------------
void setup() {
    // Open serial communications and wait for port to open:
    Serial.begin(115200);
     while (!Serial) {
      ; // wait for serial port to connect. Needed for Leonardo only
    }
    
//---------------------Wired Ethernet Shield Initialization    
    // Start the Ethernet Library
    Ethernet.begin(mac, Local);
    delay(2000); 
    Serial.println("");
    Serial.println("Cable connected");  
    Serial.print("Local IP address : ");
    Serial.println(Ethernet.localIP());

    pinMode(E0_0, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_1, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_2, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_3, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_4, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_5, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_6, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_7, INPUT_PULLUP);  //Configura Pin entrada digital

    pinMode(A0_0, OUTPUT);  //Configura Pin salida digital
    pinMode(A0_1, OUTPUT);  //Configura Pin salida digital
    pinMode(A0_2, OUTPUT);  //Configura Pin salida digital
    pinMode(A0_3, OUTPUT);  //Configura Pin salida digital
}
//----------------------------------------------------------------------
// Connects to the PLC
//----------------------------------------------------------------------
bool Connect()
{
    int Result=Client.ConnectTo(PLC, 
                                  0,  // Rack (see the doc.)
                                  2); // Slot (see the doc.)
    Serial.print("Connecting to ");Serial.println(PLC);  
    if (Result==0) 
    {
      Serial.print("Connected ! PDU Length = ");
      Serial.println(Client.GetPDULength());
    }
    else
      Serial.println("Connection error");
    return Result==0;
}
//----------------------------------------------------------------------
// Main Loop
//----------------------------------------------------------------------
void loop() 
{
  int Result;
  void *Target;
   
  Target = NULL; // Uses the internal Buffer (PDU.DATA[])
  
  // Connection
  while (!Client.Connected)
  {
    if (!Connect()){
      delay(150);
      if (intentos<1) resetFunc(); //software_Reset();
      intentos--; //Intentos de comunicar antes de hacer reset.
    }
  }
  
  Result=Client.ReadArea(S7AreaDB, // We are requesting DB access
                         DBNum,    // DB Number
                         Nodo*10,  // primer byte nodo 1=10
                         10,       // We need "Size" bytes
                         Target);  // Put them into our target 
  if (Result==0)  //Comunicación OK.
    {
    //Actualiza valores del área de salida "OUTPUTS" recibidos del PLC:
    //Lee bit 0 de lo recibido en Parte Baja TX_Word (FC1)
    digitalWrite(A0_0, bitRead(PDU.DATA[4], 0)); 
    digitalWrite(A0_1, bitRead(PDU.DATA[4], 1)); 
    digitalWrite(A0_2, bitRead(PDU.DATA[4], 2)); 
    digitalWrite(A0_3, bitRead(PDU.DATA[4], 3)); 

    //Actualiza valores del área de entradas "INPUTS" a enviar al PLC:
    //Envía estado negado de la entrada al bit x del RX_Word (FC1)
    bitWrite( PDU.DATA[6] , 0, !digitalRead(E0_0));  
    bitWrite( PDU.DATA[6] , 1, !digitalRead(E0_1));  
    bitWrite( PDU.DATA[6] , 2, !digitalRead(E0_2));  
    bitWrite( PDU.DATA[6] , 3, !digitalRead(E0_3));  
    bitWrite( PDU.DATA[6] , 6, !digitalRead(E0_6));  
    bitWrite( PDU.DATA[6] , 7, !digitalRead(E0_7));  

    //Estas dos entradas son Analógicas y se deben tratar de tal forma
    if(analogRead(E0_4) > 800)  bitWrite( PDU.DATA[6] , 4, LOW);
                        else  bitWrite( PDU.DATA[6] , 4, HIGH);

    if(analogRead(E0_5) > 800)  bitWrite( PDU.DATA[6] , 5, LOW);
                        else  bitWrite( PDU.DATA[6] , 5, HIGH);

    //Activa a 1 el bit2 DB1.DBX xx8.2, indica al PLC Buffer_Entrada=1.
    bitWrite(PDU.DATA[8], 2, 1);  //Activa a 1 el bit2 DB1.DBX xx8.2
    
    Client.WriteArea(S7AreaDB,     // We are requesting DB access
                         DBNum,    // DB Number
                         Nodo*10,  // primer byte nodo 1=10
                         10,       // We need "Size" bytes
                         Target);  // Put them into our target 
    }
  delay(50); //Pruebas de tiempo cada 50ms. por cable va perfecto. 
}

 如您所见,我们输入了网络数据:

 如您所见,我们输入了网络数据:我们引入了本地 IP 192.168.1.45 和 PLC WinAc RTX 192.168.1.51

 在节点 1 中输入 。

 我们选择机架 0 插槽 2。

 我们选择我们使用的控制器类型(Arduino NANO)。

 通过 USB 电缆将主板连接到电脑,然后按”生成和传输”图标。

 本节结束…

 7.2 基于 I/O 卡(阿杜诺 UNO)

  此条目与前一点非常相似,在编译处理器时的不同之处在于 Arduino UNO。程序也是不同的。

 

 在这种情况下,我们必须调整程序,以适应我们想要使用的Arduino的输入和输出端口。

 我们的计划:

   我们运行 Arduino V1.8.7 编程环境。我们介绍程序。以前,我们必须下载库(Settimino),该库将西门子的通信协议纳入我们的 Arduino 项目。

/*----------------------------------------------------------------------
Modulo IO Arduino UNO
Probado por Cable Ethernet en placa (Arduino UNO) mas Shield Wiznet

Compilado con Arduino IDE 1.8.7
JColl Agosto.2019

 Agosto 2019: El número de IP está sujeto al Número de nodo.
              IP es = 192.168.1.NODO
              Compilado para Arduino UNO + W5100
----------------------------------------------------------------------*/
#define E0_0   A0   // Nº de Pin correspondiente a la entrada digital.
#define E0_1   A1   // Nº de Pin correspondiente a la entrada digital.
#define E0_2   A2   // Nº de Pin correspondiente a la entrada digital.
#define E0_3   A3   // Nº de Pin correspondiente a la entrada digital.
#define E0_6   8    // Nº de Pin correspondiente a la entrada digital.
#define E0_7   7    // Nº de Pin correspondiente a la entrada digital. 

//Estas dos entradas son únicamente Analógicas
#define E0_4   A6   // Nº de Pin correspondiente a la entrada Analógica.
#define E0_5   A7   // Nº de Pin correspondiente a la entrada Analógica.

#define A0_0   3    // Nº de Pin correspondiente a la Salida digital.
#define A0_1   4    // Nº de Pin correspondiente a la Salida digital.
#define A0_2   5    // Nº de Pin correspondiente a la Salida digital.
#define A0_3   6    // Nº de Pin correspondiente a la Salida digital.

void software_Reset(){   asm volatile ("  jmp 0");  } 
void(* resetFunc) (void) = 0; //declare reset function at address 0

#include <SPI.h>
#include <Ethernet.h>
#include "Settimino.h"

int DBNum = 1; // This DB must be present in your PLC
byte Buffer[8];
int Nodo = 10; // Indicar aqui el número de Nodo de la tarjeta (1-25)

byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x08, Nodo};

IPAddress Local(192,168,1,Nodo); // Local Address fixed Node num.
IPAddress PLC(192,168,1,51);   // PLC Address
IPAddress Subnet(255,255,255,0);
int intentos =5; //Intentos de comunicar antes de hacer reset.

S7Client Client(_S7WIRED);

unsigned long Elapsed; // To calc the execution time
//----------------------------------------------------------------------
// Setup : Init Ethernet and Serial port
//----------------------------------------------------------------------
void setup() {
    // Open serial communications and wait for port to open:
    Serial.begin(115200);
     while (!Serial) {
      ; // wait for serial port to connect. Needed for Leonardo only
    }
    
//--------------------------------Wired Ethernet Shield Initialization    
    // Start the Ethernet Library
    Ethernet.begin(mac, Local);
    delay(2000); 
    Serial.println("");
    Serial.println("Cable connected");  
    Serial.print("Local IP address : ");
    Serial.println(Ethernet.localIP());

    pinMode(E0_0, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_1, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_2, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_3, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_4, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_5, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_6, INPUT_PULLUP);  //Configura Pin entrada digital
    pinMode(E0_7, INPUT_PULLUP);  //Configura Pin entrada digital

    pinMode(A0_0, OUTPUT);  //Configura Pin salida digital
    pinMode(A0_1, OUTPUT);  //Configura Pin salida digital
    pinMode(A0_2, OUTPUT);  //Configura Pin salida digital
    pinMode(A0_3, OUTPUT);  //Configura Pin salida digital
}
//----------------------------------------------------------------------
// Connects to the PLC
//----------------------------------------------------------------------
bool Connect()
{
    int Result=Client.ConnectTo(PLC, 
                                  0,  // Rack (see the doc.)
                                  2); // Slot (see the doc.)
    Serial.print("Connecting to ");Serial.println(PLC);  
    if (Result==0) 
    {
      Serial.print("Connected ! PDU Length = ");
       Serial.println(Client.GetPDULength());
    }
    else
      Serial.println("Connection error");
    return Result==0;
}
//----------------------------------------------------------------------
// Main Loop
//----------------------------------------------------------------------
void loop() 
{
  int Result;
  void *Target;
   
  Target = NULL; // Uses the internal Buffer (PDU.DATA[])
  
  // Connection
  while (!Client.Connected)
  {
    if (!Connect()){
      delay(150);
      if (intentos<1) resetFunc(); //software_Reset();
      intentos--; //Intentos de comunicar antes de hacer reset.
    }
  }
  
  Result=Client.ReadArea(S7AreaDB, // We are requesting DB access
                         DBNum,    // DB Number
                         Nodo*10,  // primer byte nodo 1=10
                         10,       // We need "Size" bytes
                         Target);  // Put them into our target
  if (Result==0)  //Comunicación OK.
    {
    //Actualiza valores del área de salida "OUTPUTS" recibidos del PLC:
    digitalWrite(A0_0, bitRead(PDU.DATA[4], 0)); 
    digitalWrite(A0_1, bitRead(PDU.DATA[4], 1)); 
    digitalWrite(A0_2, bitRead(PDU.DATA[4], 2)); 
    digitalWrite(A0_3, bitRead(PDU.DATA[4], 3)); 

    //Actualiza valores del área de entradas "INPUTS" a enviar al PLC:
    //Envía estado negado de la entrada digital al bit x de la Parte baja RX_Word (FC1)
    bitWrite( PDU.DATA[6] , 0, !digitalRead(E0_0));  
    bitWrite( PDU.DATA[6] , 1, !digitalRead(E0_1));  
    bitWrite( PDU.DATA[6] , 2, !digitalRead(E0_2));  
    bitWrite( PDU.DATA[6] , 3, !digitalRead(E0_3));  
    bitWrite( PDU.DATA[6] , 6, !digitalRead(E0_6)); 
    bitWrite( PDU.DATA[6] , 7, !digitalRead(E0_7));  

 //Estas dos entradas son únicamente Analógicas
    if(analogRead(E0_4) > 800)  bitWrite( PDU.DATA[6] , 4, LOW);
                        else  bitWrite( PDU.DATA[6] , 4, HIGH);

    if(analogRead(E0_5) > 800)  bitWrite( PDU.DATA[6] , 5, LOW);
                        else  bitWrite( PDU.DATA[6] , 5, HIGH);

    //Activa a 1 el bit2 DB1.DBX xx8.2, indica al PLC Buffer_Entrada=1.
    bitWrite(PDU.DATA[8], 2, 1);  //Activa a 1 el bit2 DB1.DBX xx8.2
    
    Client.WriteArea(S7AreaDB,     // We are requesting DB access
                         DBNum,    // DB Number
                         Nodo*10,  // primer byte nodo 1=10
                         10,       // We need "Size" bytes
                         Target);  // Put them into our target 
  }
  delay(50); //Pruebas de tiempo cada 50ms. por cable va perfecto. 
}

 如您所见,我们输入了网络数据:

 介绍本地 IP 192.168.1.10 和 WinAc RTX PLC 192.168.1.51

 输入节点号 10。

 我们选择机架 0 插槽 2。

 我们选择正在使用的控制器类型(Arduino UNO)。

 通过 USB 电缆将主板连接到电脑,然后按”生成和传输”图标。

 

 本节结束…

 7.3 基 I/O 卡 (ESP8266 Wifi)

 在此条目中,我们将介绍 ESP8266 控制器,该控制器已在 Internet 项目控制的中继中以前的条目中。

 

 它是一种 PCB,配备 Wifi 通信,具有光耦合输入和继电器输出。

 此卡没有要编程的 USB 端口,因此我们必须有一个 USB 到 TTL 串行端口适配器才能为程序充电。

 我们的计划:

   我们运行 Arduino V1.8.7 编程环境。我们介绍程序。以前,我们必须下载库 (Settimino), 并在 Arduino IDE 中安装了 ESP8266 驱动程序。

/*----------------------------------------------------------------------
Modulo IO Arduino 1 Input 2 Outputs

MicroProcesador ESP8266 con WIFI 802.11b/g/n

 La comunicación depende de la cobertura y saturación del Wifi.
 Compilado con Arduino IDE 1.8.7
 JColl Agosto.2019

 15 Agosto 2019: El número de IP está sujeto al Número de nodo.
                 IP es = 192.168.1.NODO
                 Compilado para placa (Generic ESP8266 Module) 
----------------------------------------------------------------------*/

#define E0_0   5    // Nº de Pin de la entrada digital Opto-acoplada.
#define A0_0   4    // Nº de Pin de la Salida del RELE.
#define LED    2    // Nº de Pin de la Salida LED Azul.

// CONFIGURACION DEL WIFI 
char ssid[] = "MiRouter";   // SSID (name)
char pass[] = "12345678";         //  password 
int DBNum = 1; // This DB must be present in your PLC
int Nodo = 11; // Indicar aqui el número de Nodo de la tarjeta (1-25)

void(* resetFunc) (void) = 0; //declare reset function at address 0

#include <SPI.h>
#include <Ethernet.h>
#include <ESP8266WiFi.h> //Incluye la librería ESP8266WiFi
#include "Settimino.h"

byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x08,Nodo};

IPAddress Local(192,168,1,Nodo); // Local Address
IPAddress PLC(192,168,1,51);   // PLC Address

IPAddress Gateway(192,168,1,1);
IPAddress Subnet(255,255,255,0);

byte Buffer[8];
S7Client Client(_S7WIFI);

int intentos; //Intentos de comunicar antes de hacer reset.
//----------------------------------------------------------------------
// Setup : Init Ethernet and Serial port
//----------------------------------------------------------------------
void setup() {
    // Open serial communications and wait for port to open:
    Serial.begin(115200);
     while (!Serial) {;}

    Serial.print("Conectando al WIFI ");
    WiFi.begin(ssid, pass);
    WiFi.config(Local, Gateway, Subnet);
    while (WiFi.status() != WL_CONNECTED) 
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi conectado a IP:");  
    Serial.println(WiFi.localIP());

    pinMode(E0_0, INPUT);  //Configura Pin entrada digital
    pinMode(A0_0, OUTPUT);  //Configura Pin salida digital
    pinMode(LED, OUTPUT);   //Configura Pin salida digital
}
//----------------------------------------------------------------------
// Connects to the PLC
//----------------------------------------------------------------------
bool Connect()
{
    int Result=Client.ConnectTo(PLC, 
                                  0,  // Rack (see the doc.)
                                  2); // Slot (see the doc.)
    if (Result==0) 
       Serial.print("Conectado OK!");
       else
        Serial.println("Error No conectado.....");
    return Result==0;
}

//----------------------------------------------------------------------
// Prints the Error number
//----------------------------------------------------------------------
void CheckError(int ErrNo)
{
  Serial.print("Error No. 0x");
  Serial.println(ErrNo, HEX);
  
  // Checks if it's a Severe Error => we need to disconnect
  if (ErrNo & 0x00FF)
  {
    Serial.println("SEVERE ERROR, disconnecting.");
    Client.Disconnect(); 
  }
}
//----------------------------------------------------------------------
// Main Loop
//----------------------------------------------------------------------
void loop() 
{
  int Result;
  void *Target;

  intentos =25; //Intentos de comunicar antes de hacer reset.
  digitalWrite(LED, HIGH); //Reset Indicación Led Azul 

  // Connection
  while (!Client.Connected)
  {
    if (!Connect()){
      delay(295);
      if (intentos<1) resetFunc(); //software_Reset();
      intentos--; //Intentos de comunicar antes de hacer reset.
    }
  }
  Target = NULL; // Uses the internal Buffer (PDU.DATA[]) 
  Result=Client.ReadArea(S7AreaDB, // We are requesting DB access
                         DBNum,    // DB Number
                         Nodo*10,  // primer byte nodo 1=10
                         10,       // We need "Size" bytes
                         NULL);    // Uses the internal Buffer (PDU.DATA[])
 
  if (Result==0)  //Comunicación OK.
    {
    //Actualiza valores del área de salida "OUTPUTS" recibidos del PLC:
    digitalWrite(A0_0, bitRead(PDU.DATA[4], 0));  
    //Actualiza valores del área de entradas "INPUTS" a enviar al PLC:
    //Envía estado negado de la entrada digital al bit x (FC1)
    bitWrite( PDU.DATA[6] , 0, !digitalRead(E0_0));    
    //Activa a 1 el bit2 DB1.DBX xx8.2, indica al PLC Buffer_Entrada=1.
    bitWrite(PDU.DATA[8], 2, 1);  //Activa a 1 el bit2 DB1.DBX xx8.2

    Result=Client.WriteArea(S7AreaDB,  // We are requesting DB access
                         DBNum,    // DB Number
                         Nodo*10,  // primer byte nodo 1=10
                         10,       // We need "Size" bytes
                         NULL);    // Uses the internal Buffer (PDU.DATA[])
    if (Result==0)  //Comunicación OK.
      {
       Serial.println("Fin comunicacion OK TOTAL --->"); 
       digitalWrite(LED, LOW); //Led Azul finalización de una trama OK.
      }else CheckError(Result);// Evalúa el tipo de error.
    }else CheckError(Result);// Evalúa el tipo de error.
    
  delay(200); //Pruebas de tiempo cada 200ms. por Wifi es aceptable. 
}

 如您所见,我们输入了网络数据:

 介绍本地 IP 192.168.1.11 和 WinAc RTX PLC 192.168.1.51

 输入节点号 11。

 我们配置路由器的 Wifi 网络名称和密码。

 我们选择机架 0 插槽 2。

 我们选择正在使用的控制器类型 (ESP8266)。

 通过 USB 连接到 TTL 串行端口适配器将主板连接到 PC。

  我们将跳线放在屏幕打印的针脚上作为 BOOT,并将板馈送至 12V。这将强制编程模式。

  单击”生成和传输”图标。最后,我们必须删除 BOOT 跳线以退出编程模式。

 本节结束…

 7.4-程序 STEP-7 (PLC 西门子)

 此项目的工作原理是通过为此目的创建的模块与 PLC 通信,并允许 WinAC PLC 与 ARDUINO 从站进行通信。

 使用 STEP7 V5.5 软件对 PLC 部件进行编程

  在这里,我展示了一个小程序,它执行与 DB1 数据库信息互连的功能,该数据库是与 Arduino 的链路。我们可以看到,我们首先需要内部函数的字节数组,然后是数组 0.25 类型”Node”,它是为网络的每个可能的节点创建的模板。

 

 UDT 或模板为:

 

我们可以看到每个节点使用的总字节数。FC1:用于根据 DB1 的数据更新输入和输出图像的功能。  

 

 OB1:主程序块,其中第一次调用 FC1 函数,其中每个节点的输入/输出区域更新,并允许继续编程,就像 IO 卡是本机 PLC 卡一样。

 参数化数据:

  W_Dog = 30 WatchDog 3 秒。在指示通信丢失之前

 NumNode-1 单个节点编号,必须在 Arduino 卡上声明相同

  TX_WordTM AW0 发送输出字 0 的状态。(我们的卡使用字节 AB0)。

  RX_WordTM EW0 捕获输入字 0 的状态。(我们的卡使用字节 EB0)。

 连接 1 告诉我们,如果监视狗处于非活动状态。

  错误-0 告诉我们是否有任何参数已跨范围。我们将拨打 FC1 的呼叫,就像我们的网络中提供的那样。

 

 OB1 主程序列表:

S7-OB1

 主程序 FC1 的列表:

S7-FC1

 注意:不得更改 PLC 及其硬件的配置以合并此卡。

  也就是说,PLC 不会监控此卡的存在和正常运行。我们只会使用 WatchDog 监视通信之间的节奏,并在时间超过配置的时间时用 Conect 位指示。

 在任何情况下,PLC 都不得因通信丢失而停止。

 从这里,我们可以开发我们的自定义输入和输出硬件的学习项目。

 程序结束…