Conocimientos relacionados con la comunicación ADS y prueba de Beckhoff Twincat 3

Introducción a ADS

YapethsDY 2020/08/27 PM

  • Arquitectura del sistema Twincat basada en ADS

En el sistema Beckhoff TwinCAT, el modo de trabajo de cada módulo de software (como TwinCAT PLC, TwinCAT NC, aplicación de Windows, etc.) es similar al dispositivo de hardware, pueden trabajar de forma independiente y el intercambio de información entre cada módulo de software se completa a través de TwinCAT ADS. Por lo tanto, cada dispositivo ADS puede intercambiar datos e información. (Obtener un ppt oficial)

  • Descripción general del protocolo de comunicación ADS

El protocolo de comunicación ADS se encuentra en la capa de aplicación del protocolo de comunicación de red.

  • Identificación del dispositivo del protocolo de comunicación ADS

Cada dispositivo ADS tiene su propio número de puerto AdsAmsNetID y AdsPort único, que también son sus dos atributos más importantes.

• AdsPort especifica el dispositivo virtual de comunicación (servidor ADS), que es diferente y fijo, mientras que el puerto de la aplicación cliente ADS es variable. El puerto predeterminado es 851 cuando se crea el programa plc.
• AdsAmsNetId especifica el enrutador ADS y es una extensión de la dirección IP de TCP. Cuando la IP de una PC es "192.168.10.10", AdsAmsNetId es "192.168.10.10.1.1".

  • Método de comunicación ADS

  1. Asincrónico (asincrónico)

El cliente de ADS envía una solicitud de ADS al servidor de ADS, mientras el cliente continúa su trabajo. Una vez que el servidor ADS procesa la solicitud, envía la respuesta al cliente en forma de una función de devolución de llamada.

      2. Método de notificación (notificación)

El cliente ADS envía una solicitud ADS al servidor ADS, y el servidor ADS envía continuamente respuestas al cliente en forma de una función de devolución de llamada hasta que el cliente cancela la solicitud.
Estos dos métodos de comunicación son muy eficientes, pero requieren programas de cliente complejos.
Ventajas: No causará bloqueo del sistema.
Desventajas: No se garantiza que se devolverán todas las solicitudes.

       3. Modo síncrono (síncrono)

El cliente de ADS envía una solicitud de ADS al servidor de ADS y el programa cliente deja de ejecutarse durante el proceso de comunicación hasta que recibe una respuesta del servidor de ADS.
Este método de comunicación no requiere un programa cliente complicado, pero su método de comunicación por turnos trae una carga relativamente grande al sistema, por lo que la eficiencia de la comunicación es baja.
Ventajas: puede devolver resultados al instante.
Desventaja: si falla la comunicación, el sistema se bloqueará.

  • Cómo ADS accede a las variables

1. Método de dirección

La dirección de una variable de PLC se compone de dos partes: GroupIndex y OffsetIndex, la primera generalmente es diferente del tipo de registro y generalmente es constante. Esta última es la dirección de compensación de la variable, que es la dirección de la variable en el PLC.

2. Método de nombre de variable

Cada variable en el dispositivo TwinCAT ADS tiene un identificador (Handle) Para acceder a la variable usando el nombre de la variable, primero necesita obtener el identificador de la variable.


entorno de prueba:

  • Plataforma de desarrollo Twincat 3
  • entorno de windows 7
  • VS 2015 c # desarrollo IDE

Primero, aclare el proceso de llamada en el entorno .net, la carga de la biblioteca de componentes ADS no se repetirá


Hay dos formas de probar


 

 

/******************************************************************************
* ProjectName:  AdsProject
* Description:  ADS通讯类,主要完成以下功能
*               1.与ADS设备连接,断开
*               2.同步通讯(读/写变量)的方法
* ClassName:    ADSInteractionHMI
* CLRVersion:   .NET Framework 4.5及以上
* Author:       YapethsDY
* NameSpace:    ADSInteractionHMI
* MachineName:  ThinkPad T460
* CreateTime:   2020/08/27 晚
* UpdatedTime:  Null
* others:       未来待实现通过订阅方式获取变量值变更的方法
*               那样看起来不需要浪费多余的资源
* Others        
* Copyright(C)  All rights reserved
*******************************************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using TwinCAT.Ads;

namespace ADSInteractionHMI
{
    class ADSOperation
    {
        private TcAdsClient ADSClient = new TcAdsClient() ;

        //ADS通讯打开
        public int ADSOpen(string[] adsTagsNameArray)
        {
            int iRet = -1;
            int Index = 0;
            ADSClient = new TcAdsClient();
            try
            {
                ADSClient.Connect(ADS.AMSNetId, ADS.AMSNetPort);
                for (Index = 0; Index < ADS.ADSTagsCount; Index++)
                {
                    MessageBox.Show("句柄创建成功");
                    //创建变量存储指定的句柄
                    ADS.adsHandleArray[Index] = 
                    ADSClient.CreateVariableHandle(adsTagsNameArray[Index]);
                }
                iRet = 0;
            }
            catch (System.Exception ex)
            {
                //异常日志记录
                LogHelper.ErrorLog(null, ex);
                iRet = -1;
            }
            return iRet;
        }
        //ADS读取
        public int ADSRead(int Handle, ref object Value, Type type)
        {
            object tmp = 0;
            int iRet = -1;
            try
            {
                tmp = ADSClient.ReadAny(Handle, type);
                iRet = 0;
            }
            catch (System.Exception ex)
            {
                iRet = -1;
                Debug.WriteLine(ex.Message);
                Debug.WriteLine("ADSClient.ReadAny异常");      
                MessageBox.Show(ex.Message);
            }
            if (0 == iRet)
            {
                Value = tmp;
            }
            return iRet;
        }
        //ADS写入
        public int ADSWrite(int Handle, object Value)
        {
            int iRet = -1;
            try
            {
                ADSClient.WriteAny(Handle, Value);
                iRet = 0;
            }
            catch (System.Exception ex)
            {
                iRet = -1;
                Debug.WriteLine(ex.Message);
                Debug.WriteLine("ADSClient.WriteAny异常");
                MessageBox.Show(ex.Message);
            }
            return iRet;
        }
        //ADS关闭
        public int ADSClose()
        {
            int Index = 0;
            try
            {
                //删除创建的句柄
                for (Index = 0; Index < ADS.ADSTagsCount; Index++)
                {
                    ADSClient.DeleteVariableHandle(ADS.adsHandleArray[Index]);
                }
            }
            catch (System.Exception ex)
            {
                //异常日志记录
                LogHelper.ErrorLog(null, ex);
            }
            finally
            {
                //资源释放
               ADSClient.Dispose();
            }
            return 0;
        }
    }
}

//**********************************************************************************
class ADS{
      public static bool ADSok = false;     //ADS连接/断开状态
      public const string AMSNetId = "192.168.10.10.1.1"; //本地AMSNetID 
      public const int AMSNetPort = 851;     //建的PLC工程默认端口号
      public const int ADSTagsCount = 10;   //相关联的变量总数
      public static ADSOperation ADSOperation = new ADSOperation();//ADS通讯客户端对象明
      public static ADSCommunication ADSCommunication = new ADSCommunication();//ADS通讯
      public static string[] adsTagsNameArray = new string[ADSTagsCount];//ADS变量的名称
      public static int[] adsHandleArray = new int[ADSTagsCount]//所需读取的ADS变量句柄数组
      public static LogRecord tcLogRecord = new LogRecord();//日志记录对象声明  
}                                                                  
//后续还需要初始化变量名与句柄的对应关系  比较冗余就不写了

Aunque este método de escritura es simple, es un desperdicio de recursos. Es necesario agregar un temporizador al hilo principal o al hilo de actualización de la interfaz. Algunas variables que no necesitan ser leídas en un corto período de tiempo también se vuelven de alta prioridad, lo cual es muy derrochador. Mañana aumentará la forma de activación de eventos o registro json para leer, por supuesto, aún depende del nombre de la variable para operar.

¡final feliz!

 

 

Supongo que te gusta

Origin blog.csdn.net/Ding86341631/article/details/108259212
Recomendado
Clasificación