.net应用程序和TW3的ADS之间通讯

Beckhoff ADS (Automation DeviceSpecification)提供一个应用程序之间互相通信的接口,在TW3系统中,TwinCAT PLC,TwinCAT NC等被设计成虚拟的自动化设备,类似于实际的物理设备与设备之间通过基于TCP协议的路由来交换信息,参考下面的图示


ADS设备最重要的两个属性就是端口号和AdsAmsNetId

•  AdsPortNr   指定通信的虚拟设备(ADS server),比如PLC,NC
•  AdsAmsNetId  指定ADS路由器,是TCP IP地址的扩展


既然是基于TCP协议,那对照TCP/IP七层协议如下


接着看下ADS协议/报文的数据结构


在AMS Header中存放着上面提到的AMS NET ID和PORT


还有从PLC Read和Write变量时存放的变量地址和偏移量


ADS 设备之间的通讯有多种方式,不同方式有不同的特点。

1.一般的ADS 通讯(General ADS Services)

  - 异步方式(Asynchronous)

  ADS 客户端向ADS 服务器发送ADS 请求,同时客户端继续自己的工作。ADS 服务器处理请求后,把响应以Call-back 函数方式发给客户端。

  - 通知方式(Notification)

  ADS 客户端向ADS 服务器发送ADS 请求,ADS 服务器以Call-back 函数的方式不断向客户端发送响应,直到客户端取消该请求。PLC变量不更新,就不会向客户端相应,类似于OPC通信的订阅。

这两种通讯方式的效率高,但需求复杂的客户端程序。

优点:不会造成系统堵塞

缺点:不能确保每次请求都有返回

2.特殊的ADS 通讯(Specific ADS Services)

TwinCATADS 设备和Windows应用程序(例如VB、VC 应用程序等)之间的通讯除了可以采用一般的ADS 通讯方式外,还可以采用特殊的通讯方式,即同步通讯方式。

- 同步方式(Synchronous)

ADS 客户端向ADS 服务器发送ADS 请求,在通讯过程中客户端程序停止执行,直到获得ADS 服务器返回的响应。

这种通讯方式不需求复杂的客户端程序,但其轮循的通讯方式给系统带来比较大的负载,因此通讯效率较低。

优点:能即时返回结果

缺点:如果通讯故障会造成系统堵塞


TwinCAT ADS访问变量有两种方式:
1.地址方式
一个PLC变量的地址由两部分组成:GroupIndex和OffsetIndex:
GroupIndex一般用于区别寄存器类型,在TwinCAT ADS设备中为常量,具体内容可以参考Information System(后附常用的GroupIndex值)。
OffsetIndex为变量的偏移地址,在PLC中为该变量的地址。
2.变量名方式
在TwinCAT ADS设备中每个变量都有一个句柄(Handle)。
适用变量名访问变量首先需要得到该变量的句柄。(不同的高级语言方式略有不同)



测试中使用的异步通讯方式,通过变量名方式,代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;using TwinCAT.Ads;namespace TW3_ADS_test
{public partial class Form1 : Form{private TcAdsClient tcAdsClient;                      //会有变量定义在类外面吗,比如说在CLASS Form1外面定义变量,共几个类用???private int hander1, hander2,hd1,hd2,hd3,hd4;private AdsStream iStream;private AdsStream bStream;private AdsStream sStream;private AdsBinaryReader iBinaryReader;private AdsBinaryReader bBinaryReader;private AdsBinaryReader sBinaryReader;private AdsBinaryWriter sBinaryWriter;private bool[] b;/// <summary>/// Form1窗口构造函数,窗口初始化/// </summary>public Form1(){InitializeComponent();iStream = new AdsStream(3 * 2);//流数据必须赋值大小,否则报错:无法在流的结尾之外进行读取bStream = new AdsStream(3);sStream = new AdsStream(7);iBinaryReader = new AdsBinaryReader(iStream);bBinaryReader = new AdsBinaryReader(bStream);sBinaryReader = new AdsBinaryReader(sStream);sBinaryWriter = new AdsBinaryWriter(sStream);try{Connect to local PLC - Runtime 1 - TwinCAT2 Port=801, TwinCAT3 Port=851tcAdsClient = new TcAdsClient();tcAdsClient.Connect(851);hander1 = tcAdsClient.CreateVariableHandle("MAIN.ivar");hander2 = tcAdsClient.CreateVariableHandle("MAIN.bvar");hd1 = tcAdsClient.CreateVariableHandle("MAIN.bvar[0]");hd2 = tcAdsClient.CreateVariableHandle("MAIN.bvar[1]");hd3 = tcAdsClient.CreateVariableHandle("MAIN.bvar[2]");hd4 = tcAdsClient.CreateVariableHandle("MAIN.svar");}catch(Exception ex){MessageBox.Show("ADS设备连接失败,请确认变量名和PLC运行状态:"+ex.Message );}}/// <summary>/// 圆形区域重绘/// </summary>private void lightstate(){Graphics g;SolidBrush brush = new SolidBrush(Color.Green);SolidBrush redbrush = new SolidBrush(Color .Red );g = CreateGraphics();if (b[0])g.FillEllipse(brush, 80, 80, 40, 40);elseg.FillEllipse(redbrush ,80,80,40,40);if (b[1])g.FillEllipse(brush, 220, 80, 40, 40);elseg.FillEllipse(redbrush, 220, 80, 40, 40);if (b[2])g.FillEllipse(brush, 350, 80, 40, 40);elseg.FillEllipse(redbrush, 350, 80, 40, 40);}/// <summary>/// 初始化状态圆形区域/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Paint(object sender, EventArgs e){Graphics g;SolidBrush brush = new SolidBrush(Color.Red);//Pen pen = new Pen( Color.Red,1); //画空心圆g = CreateGraphics();g.FillEllipse(brush,80,80,40,40);g.FillEllipse(brush, 220, 80, 40, 40);g.FillEllipse(brush, 350, 80, 40, 40);//g.DrawEllipse (pen,400,80,40,40);}/// <summary>/// 窗口Load事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){this .Paint +=new PaintEventHandler(Form1_Paint);//不是在VS里双击过来的事件,可以手动添加委托timer1.Interval = 100;button4.Enabled = true;button5.Enabled = false;listBox1.Items.Clear();}private void timer1_Tick(object sender, EventArgs e){b = new bool[3];try{tcAdsClient.Read(hander1, iStream);tcAdsClient.Read(hander2, bStream);tcAdsClient.Read( hd4 ,sStream );iStream.Position = 0;                                               //否则报错:无法在流的结尾之外进行读取textBox1.Text = iBinaryReader.ReadInt16().ToString();textBox2.Text = iBinaryReader.ReadInt16().ToString();textBox3.Text = iBinaryReader.ReadInt16().ToString();bStream.Position = 0;b[0] = bBinaryReader.ReadBoolean();b[1] = bBinaryReader.ReadBoolean();b[2] = bBinaryReader.ReadBoolean();sStream.Position = 0;//TwinCAT.Ads.NET version >= 1.0.0.10: new method//listBox1.Items.Add( sBinaryReader .ReadPlcString(4) );//TwinCAT.Ads.NET version < 1.0.0.10:old methodlistBox1.Items.Add(tcAdsClient .ReadAny ( hd4 ,typeof ( string ),new int []{7}));}catch( Exception ex ){MessageBox.Show("读PLC数据错误"+ex.Message );}lightstate();}/// <summary>/// 开始读数据从PLC/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){sBinaryWriter.WritePlcString( textBox1 .Text ,7 );tcAdsClient.Write( hd4 ,sStream );timer1.Enabled = true;button4.Enabled = false;button5.Enabled = true;}/// <summary>/// 停止和PLC的ADS通信/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button5_Click(object sender, EventArgs e){timer1.Enabled = false;button4.Enabled = true;button5.Enabled = false;}private void button1_Click(object sender, EventArgs e){if (b[0])b[0] = false; elseb[0] = true;}private void button2_Click(object sender, EventArgs e){if (b[1])b[1] = false;elseb[1] = true;tcAdsClient.WriteAny( hd2 ,b[1] );}private void button3_Click(object sender, EventArgs e){if (b[2])b[2] = false;elseb[2] = true;}}
}

PLC代码:

PROGRAM MAIN

VARivar:ARRAY[0..2]OF INT;bvar:ARRAY[0..2]OF BOOL;index:INT;svar:STRING:='test';
END_VAR
FOR index:=0 TO 2 DOivar[index]:=500+index;
END_FOR
bvar[0]:=TRUE;
bvar[2]:=TRUE;



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于CTP的期货集中管理系统之登录篇

上一篇是说要做这个管理系统&#xff0c;还没开始做&#xff0c;就头皮发麻了。想想要实现那么多功能&#xff0c;已经想放弃了。但是呢&#xff0c;我们是日拱一卒的时间主义者&#xff0c;小小的抵触情绪是无法打到我们的。 前端使用VUE,后端使用C来做分布式交易管理总控系统…

仿QQ即时通信系统

这学期学了网络编程&#xff0c;课设是让做一个通信系统&#xff0c;就模仿腾讯的产品设计一个仿QQ的通信系统。PS&#xff1a;用的时候&#xff0c;背景可以改一下&#xff0c;XX公司需要一个内部通信系统… 话不多说&#xff0c;先上图片&#xff0c;再慢慢讲原理吧。 效果示…

基于nchan打造百万用户的聊天室

大家好&#xff0c;我是烤鸭&#xff1a; 这次介绍下nchan&#xff0c;nginx的一个module。 nchan 源码: https://github.com/slact/nchan 官网: https://nchan.io/ nginx 配置说明文档: https://nchan.io/documents/nginxconf2016-slides.pdf 测试环境搭建 4 台linux cent…

基于MT5的沪深股票回测二 导入历史数据

回测的基础是是历史数据 以导入日线数据为例 1.打开交易品种 2. 找到目标合约 3.选择要处理的数据周期&#xff0c;日线选择daily 然后导入处理后的日K线数据 注意历史数据需要符合MT5的数据格式 此次有一个不是bug的显示&#xff0c;最多显示2000条记录&#xff0c;实际更多…

探索 Google Bard 的 10 大令人兴奋的新功能

这家科技巨头开发的人工智能聊天机器人 Google Bard 最初发布时,收到的评价平平。然而,随着最近在 Google I/O 2023 开发者大会上发布其改进版本,Google Bard 的情况发生了重大变化。全新改进的 Google Bard AI 具有许多令人兴奋的功能。让我们仔细看看谷歌吟游诗人的特点:…

万众瞩目,谷歌的反击来了!全新PaLM 2反超GPT-4,办公全家桶炸裂升级,Bard史诗进化...

Datawhale干货 最新&#xff1a;谷歌 PaLM 2&#xff0c;来源&#xff1a;量子位 万众瞩目&#xff0c;谷歌的反击来了。 现在&#xff0c;谷歌搜索终于要加入AI对话功能了&#xff0c;排队通道已经开放。 当然这还只是第一步。 大的还在后面&#xff1a; 全新大语言模型PaLM …

LaTeX插入图片

基本语法 常用选项[htbp]是浮动格式&#xff08;参考《LaTeX2e插图指南》16.2节和《Ishort》3.9节&#xff09;&#xff1a; 『h』当前位置。将图形放置在正文文本中给出该图形环境的地方。如果本页所剩的页面不够&#xff0c;这一参数将不起作用。『t』顶部。将图形放置在页…

chatgpt赋能python:Python抓取电脑应用软件数据

Python抓取电脑应用软件数据 随着互联网技术的不断发展&#xff0c;我们的生活方式也在发生着巨大变化&#xff0c;如今&#xff0c;我们已经可以依靠计算机应用软件对生活的各个方面进行掌控。而如何获取这些软件的数据&#xff0c;以及对这些数据进行分析&#xff0c;也成为…

chatgpt赋能python:Python程序如何变成电脑程序

Python程序如何变成电脑程序 简介 Python是一种高级编程语言&#xff0c;它在数据科学、人工智能、Web开发、机器学习、AI等领域非常流行。在Python中编写的程序需要转化为计算机程序才能执行。在这篇文章中&#xff0c;我们将解释Python编写的程序如何变成电脑程序。 什么是…

chatgpt赋能python:Python可以入侵别人电脑吗?

Python可以入侵别人电脑吗&#xff1f; Python自从诞生以来便一直以来备受关注&#xff0c;其简单易学、高效实用的特点让无数人喜爱并成为了开发人员的首选编程语言。但是&#xff0c;你可能会想知道&#xff1a;Python能够入侵别人电脑吗&#xff1f;今天我们就来探讨一下这…

chatgpt赋能python:如何使用Python绕过电脑开机密码?

如何使用Python绕过电脑开机密码&#xff1f; 随着科技的发展&#xff0c;计算机已经成为我们生活和工作中必不可少的工具。当然&#xff0c;在使用计算机时保护自己的隐私也是非常重要的。电脑开机密码是最基本的保护措施之一&#xff0c;但是如果忘记了密码该怎么办呢&#…

chatgpt赋能python:Python模拟操作电脑

Python模拟操作电脑 介绍 Python是一个强大的编程语言&#xff0c;自从引入以来&#xff0c;被广泛地使用在各种领域。其中一个重要的应用场景是模拟操作电脑。这里所说的模拟操作电脑&#xff0c;是指用Python编写程序来模拟用户在计算机上的日常操作&#xff0c;例如键盘输…

chatgpt赋能python:如何用Python阻止电脑关机

如何用Python阻止电脑关机 在使用电脑的过程中&#xff0c;我们经常会遇到电脑因为各种原因自动关机的情况&#xff0c;这给我们的工作和生活带来了很多麻烦。但是&#xff0c;有了Python编程技能&#xff0c;我们可以很容易地使用Python代码来阻止电脑关机。 在本文中&#…

chatgpt赋能python:Python如何打开电脑摄像头

Python如何打开电脑摄像头 Python是一种易于学习和使用的编程语言&#xff0c;因其灵活性和强大的功能而备受欢迎。其中&#xff0c;许多人使用Python来处理图像处理和计算机视觉&#xff0c;这样&#xff0c;了解如何打开电脑摄像头是非常重要的。 在这篇文章中&#xff0c;…

基金投资咨询

针对投资者风险偏好程度高、中、低3种假设情况相应做出了投资建议&#xff1a; 假设情况1&#xff1a;投资者风险偏好程度较高 2021年12月21日&#xff0c;客户小王来到银行&#xff0c;寻求银行的理财经理推荐一款适合自己的基金&#xff0c;来完成自己100万元的投资&#x…

chatgpt赋能python:Python简化手机短信发送

Python 简化手机短信发送 作为一名有10年 Python 编程经验的工程师&#xff0c; 我们经常需要向手机发送提醒短信&#xff0c;例如验证码、通知等。通常情况下&#xff0c;我们需要使用平台 API 或自己的短信网关&#xff0c;这些方式既麻烦又不安全。在本文中&#xff0c;我将…

C#使用SendMessage发送组合键

有时需要出发菜单功能&#xff0c;例如发送ALT F打开应用程序的文件菜单&#xff0c;如何使用SendMessage实现呢&#xff1f; 使用用spy截取的ALTF的消息内容&#xff08;如何使用spy&#xff0c;请熟悉的高手指点下&#xff0c;我使用spy lite没有得到&#xff09;&#xff1…

手把手教程:解除AppleID「双重验证」

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加&#xff1a;keeepdance&#xff0c;备注&#xff1a;chatgpt&#xff0c;拉你进群。 在前面的文章中&#xff0c;我共享了两个美区ID给大家下载ChatGPT App&#xff0c;可…

Web前端工程师-优秀简历汇总

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; Web前端工程师-优秀简历汇总 1. http://ww…

xpath爬取智联招聘--大数据开发职位并保存为csv

先上项目效果图&#xff1a; 本次爬取的URL为智联招聘的网址&#xff1a;https://www.zhaopin.com/ 首先先登录上去&#xff0c;为了保持我们代码的时效性&#xff0c;让每个人都能直接运行代码出结果&#xff0c;我们要获取到我们登录上去的cookies&#xff0c;并把他放在表头…