AdsStream的使用
本例子是测试ads通信的。
1.首先添加TwinCAT.Ads引用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TwinCAT.Ads;
namespace AdsProject
{
public partial class Main : Form
{
public TcAdsClient _client = null;
//创建句柄
public int _handleBool = 0;
public int _handleByte = 0;
public int _handleInt = 0;
public int _handleArray= 0;//int
public int _handleStruct = 0;//int16 byte real(2+1+4=7) (plc中的Int对应的C#中的int16,Dint对应int,real对应float,lreal对应double,Dword对应uint32)
public int _handleStruct2 = 0;//高级结构体句柄 public int _notificationHandleInt = 0;
public int _notificationHandleStruct = 0;
public int _notificationHandleStruct2 = 0; [StructLayout(LayoutKind.Sequential, Pack = 8)]
struct TestStruct
{
[MarshalAs(UnmanagedType.I2)]
public Int16 nData;
[MarshalAs(UnmanagedType.I1)]
public byte byVal;
[MarshalAs(UnmanagedType.R4)]
public float fVal;
} public Main()
{
InitializeComponent();
}
private void Main_Load(object sender, EventArgs e)
{
try
{
if (_client == null)
{
_client = new TcAdsClient();
} //Occurs when the ADS device sends a ADS Notification(通知) to the client.
//当PLC发送数据给客户端的时候触发回调函数
//回调方式1
_client.AdsNotification += new AdsNotificationEventHandler(AdsNotificationEventOnChange);
//回调方式2
_client.AdsNotificationEx += new AdsNotificationExEventHandler(AdsNotificationEventOnChangeEx);
_client.Connect(851);
_handleBool = _client.CreateVariableHandle("MAIN.Data_Bool");
_handleByte = _client.CreateVariableHandle("MAIN.Data_Byte");
_handleInt = _client.CreateVariableHandle("MAIN.Data_Int");
_handleArray = _client.CreateVariableHandle("MAIN.Data_Array");
_handleStruct = _client.CreateVariableHandle("MAIN.Data_Struct");
_handleStruct2 = _client.CreateVariableHandle("GVL.stAxis");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
} } //回调函数2:当设备向客户端发送数据的时候触发
private void AdsNotificationEventOnChangeEx(object sender, AdsNotificationExEventArgs e)
{
if (e.NotificationHandle == _notificationHandleInt)
{
Debug.WriteLine(e.Value.ToString());
this.BeginInvoke(new Action(() =>
{
this.txtReadInt.Text = e.Value.ToString();
}));
}
else if (e.NotificationHandle == _notificationHandleStruct)
{
TestStruct testc = (TestStruct)e.Value;
Debug.WriteLine(testc.nData.ToString());
Debug.WriteLine(testc.byVal.ToString());
Debug.WriteLine(testc.fVal.ToString());
//因为是跨线程操作
this.BeginInvoke(new Action(() =>
{
this.txtReadStructInt16.Text = testc.nData.ToString();
this.txtReadStructByte.Text = testc.byVal.ToString();
this.txtReadStructFloat.Text = testc.fVal.ToString();
}));
}
//读取高级结构体
else if (e.NotificationHandle==_notificationHandleStruct2)
{
Plc_StAxisInfo plcStAxis = new Plc_StAxisInfo();
plcStAxis = (Plc_StAxisInfo)e.Value;
foreach (Plc_StAxis plc_StAxis in plcStAxis.Axis)
{
//获取结构体中的所有字段
FieldInfo[] fieldInfos = typeof(Plc_StAxis).GetFields();
int FieldCount = fieldInfos.Length;
for(int i=0;i< FieldCount;i++)
{
if (fieldInfos[i].FieldType.Name == "Byte[]")
{
byte[] b = (byte[])fieldInfos[i].GetValue(plc_StAxis);
foreach (var item in b)
{
Debug.WriteLine(item.ToString());
}
}
else if (fieldInfos[i].FieldType.Name == "Double[]")
{
double[] d = (double[])fieldInfos[i].GetValue(plc_StAxis);
foreach (var item in d)
{
Debug.WriteLine(item.ToString());
}
}
else
{
//获取字段值
Debug.WriteLine(fieldInfos[i].GetValue(plc_StAxis));
}
}
}
}
} //回调函数1:当设备向客户端发送数据的时候触发
private void AdsNotificationEventOnChange(object sender, AdsNotificationEventArgs e)
{
//AdsBinaryReader reader = new AdsBinaryReader(e.DataStream);
//if (e.NotificationHandle == _notificationHandleInt)
// Debug.WriteLine(reader.ReadInt16());
//else if (e.NotificationHandle == _notificationHandleStruct)
//{
// Debug.WriteLine(reader.ReadInt16());
// Debug.WriteLine(reader.ReadByte());
// reader.ReadByte();
// Debug.WriteLine(reader.ReadSingle());
//}
} //read
private void btnRead_Click(object sender, EventArgs e)
{
AdsStream stream = new AdsStream(100);
AdsBinaryReader reader = new AdsBinaryReader(stream);
_client.Read(_handleBool,stream);//读取设备中的数据并写入到文件流stream中
txtReadBool.Text = reader.ReadBoolean().ToString();//从当前文件流中读取Boolean值,并使当前流的位置提升1个字节 _client.Read(_handleByte, stream);
stream.Seek(0,System.IO.SeekOrigin.Begin);//设定流的位置为开头
txtReadByte.Text = reader.ReadByte().ToString();//从当前文件流中读取Boolean值,并使当前流的位置提升1个字节 _client.Read(_handleInt, stream);
stream.Seek(0, System.IO.SeekOrigin.Begin);//设定流的位置为开头
txtReadInt.Text = reader.ReadInt16().ToString();//从当前文件流中读取Boolean值,并使当前流的位置提升2个字节 _client.Read(_handleArray,stream);
stream.Seek(0, System.IO.SeekOrigin.Begin);//设定流的位置为开头
txtReadArrayInt1.Text = reader.ReadInt16().ToString();//从当前文件流中读取Boolean值,并使当前流的位置提升2个字节
txtReadArrayInt2.Text = reader.ReadInt16().ToString();
txtReadArrayInt3.Text = reader.ReadInt16().ToString();
txtReadArrayInt4.Text = reader.ReadInt16().ToString(); _client.Read(_handleStruct,stream);
stream.Seek(0,System.IO.SeekOrigin.Begin);
txtReadStructInt16.Text = reader.ReadInt16().ToString();
txtReadStructByte.Text = reader.ReadByte().ToString();
reader.ReadByte();//前面Int16是两个字节,byte是一个字节,一共三个字节,而float是占四个字节,要从第五个字节开始读,所以要再读第四个字节,然后跳到第五个字节
txtReadStructFloat.Text = reader.ReadSingle().ToString(); } //write
private void btnWrite_Click(object sender, EventArgs e)
{
try
{
AdsStream stream = new AdsStream(100);
AdsBinaryWriter writer = new AdsBinaryWriter(stream); writer.Write(Boolean.Parse(txtWriteBool.Text));
_client.Write(_handleBool, stream, 0, 1); stream.Seek(0, System.IO.SeekOrigin.Begin);//设定流的位置为开头
writer.Write(Byte.Parse(txtWriteByte.Text));
_client.Write(_handleByte, stream, 0, 1); stream.Seek(0, System.IO.SeekOrigin.Begin);//设定流的位置为开头
writer.Write(Int16.Parse(txtWriteInt.Text));
_client.Write(_handleInt, stream, 0, 2); stream.Seek(0, System.IO.SeekOrigin.Begin);//设定流的位置为开头
writer.Write(Int16.Parse(txtWriteArrayInt1.Text));
writer.Write(Int16.Parse(txtWriteArrayInt2.Text));
writer.Write(Int16.Parse(txtWriteArrayInt3.Text));
writer.Write(Int16.Parse(txtWriteArrayInt4.Text));
_client.Write(_handleArray, stream, 0, 8); stream.Seek(0, System.IO.SeekOrigin.Begin);
writer.Write(Int16.Parse(txtWriteStructInt16.Text));
writer.Write(Byte.Parse(txtWriteStructByte.Text));
writer.Write((Byte)0);//写入第四个字节
writer.Write(float.Parse(txtWriteStructFloat.Text));
_client.Write(_handleStruct, stream, 0, 8); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} //readany
private void btnReadAny_Click(object sender, EventArgs e)
{
try
{
txtReadBool.Text = _client.ReadAny(_handleBool, typeof(Boolean)).ToString();
txtReadByte.Text = _client.ReadAny(_handleByte, typeof(Byte)).ToString();
txtReadInt.Text = _client.ReadAny(_handleInt, typeof(Int16)).ToString();
//从设备中读取short[]
short[] testint = (short[])_client.ReadAny(_handleArray, typeof(short[]),new int[] { 4});
txtReadArrayInt1.Text = testint[0].ToString();
txtReadArrayInt2.Text = testint[1].ToString();
txtReadArrayInt3.Text = testint[2].ToString();
txtReadArrayInt4.Text = testint[3].ToString();
// //从设备中读取TestStruct
TestStruct tstruct = (TestStruct)_client.ReadAny(_handleStruct, typeof(TestStruct));
txtReadStructInt16.Text = tstruct.nData.ToString();
txtReadStructByte.Text = tstruct.byVal.ToString();
txtReadStructFloat.Text = tstruct.fVal.ToString();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
} //writeany
private void btnWriteAny_Click(object sender, EventArgs e)
{
short[] arraytest = new short[4]
{
short.Parse(txtWriteArrayInt1.Text),
short.Parse(txtWriteArrayInt2.Text),
short.Parse(txtWriteArrayInt3.Text),
short.Parse(txtWriteArrayInt4.Text)
};
TestStruct tstruct = new TestStruct();
tstruct.nData = Int16.Parse(txtWriteStructInt16.Text);
tstruct.byVal = Byte.Parse(txtWriteStructByte.Text);
tstruct.fVal = float.Parse(txtWriteStructFloat.Text); _client.WriteAny(_handleBool, Boolean.Parse(txtWriteBool.Text));//写入值到设备中
_client.WriteAny(_handleByte, Byte.Parse(txtWriteByte.Text));//写入值到设备中
_client.WriteAny(_handleInt, Int16.Parse(txtWriteInt.Text));//写入值到设备中
_client.WriteAny(_handleArray, arraytest);//写入值到设备中
_client.WriteAny(_handleStruct, tstruct);//写入值到设备中
}
//tryread
private void btnTryRead_Click(object sender, EventArgs e)
{
int readBytes = 0;
AdsStream stream = new AdsStream(100);
AdsBinaryReader reader = new AdsBinaryReader(stream);
//tryread函数如果读不出来将会返回errorcode,而不是抛出异常
AdsErrorCode code = _client.TryRead((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleBool, stream, out readBytes);
txtReadBool.Text = reader.ReadBoolean().ToString(); stream.Seek(0, System.IO.SeekOrigin.Begin);
_client.TryRead((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleInt, stream, out readBytes);
txtReadInt.Text = reader.ReadInt16().ToString(); stream.Seek(0, System.IO.SeekOrigin.Begin);
_client.TryRead((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleByte, stream, out readBytes);
txtReadByte.Text = reader.ReadByte().ToString(); stream.Seek(0, System.IO.SeekOrigin.Begin);
_client.TryRead((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleStruct, stream, out readBytes);
txtReadStructInt16.Text = reader.ReadInt16().ToString();
txtReadStructByte.Text = reader.ReadByte().ToString();
reader.ReadByte();
txtReadStructFloat.Text = reader.ReadSingle().ToString(); _client.TryRead((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleArray, stream, out readBytes);
stream.Seek(0, System.IO.SeekOrigin.Begin);
txtReadArrayInt1.Text = reader.ReadInt16().ToString();
txtReadArrayInt2.Text = reader.ReadInt16().ToString();
txtReadArrayInt3.Text = reader.ReadInt16().ToString();
txtReadArrayInt4.Text = reader.ReadInt16().ToString();
}
//trywrite
private void btnTryWrite_Click(object sender, EventArgs e)
{
AdsStream stream = new AdsStream(100);
AdsBinaryWriter writer = new AdsBinaryWriter(stream);
//trywrite函数如果读不出来将会返回errorcode,而不是抛出异常
writer.Write(Boolean.Parse(txtWriteBool.Text));
AdsErrorCode code1 = _client.TryWrite((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleBool, stream,0,1); stream.Seek(0, System.IO.SeekOrigin.Begin);
writer.Write(Byte.Parse(txtWriteByte.Text));
AdsErrorCode code2 = _client.TryWrite((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleByte, stream, 0, 1); stream.Seek(0, System.IO.SeekOrigin.Begin);
writer.Write(Int16.Parse(txtWriteInt.Text));
AdsErrorCode code3 = _client.TryWrite((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleInt, stream, 0, 2); stream.Seek(0, System.IO.SeekOrigin.Begin);
writer.Write(Int16.Parse(txtWriteArrayInt1.Text));
writer.Write(Int16.Parse(txtWriteArrayInt2.Text));
writer.Write(Int16.Parse(txtWriteArrayInt3.Text));
writer.Write(Int16.Parse(txtWriteArrayInt4.Text));
AdsErrorCode code4 = _client.TryWrite((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleArray, stream, 0, 8); stream.Seek(0, System.IO.SeekOrigin.Begin);
writer.Write(Int16.Parse(txtWriteStructInt16.Text));
writer.Write(Byte.Parse(txtWriteStructByte.Text));
writer.Write((Byte)0);//写入第四个字节
writer.Write(float.Parse(txtWriteStructFloat.Text));
AdsErrorCode code5 = _client.TryWrite((uint)AdsReservedIndexGroups.SymbolValueByHandle, (uint)_handleStruct, stream, 0, 8);
} private void btnAsyncRead_Click(object sender, EventArgs e)
{
//启动回调
_notificationHandleInt = _client.AddDeviceNotificationEx("MAIN.Data_Int", AdsTransMode.OnChange, 1, 0, this, typeof(short));
_notificationHandleStruct = _client.AddDeviceNotificationEx("MAIN.Data_Struct", AdsTransMode.OnChange, 1, 0, this, typeof(TestStruct)); } private void Main_FormClosed(object sender, FormClosedEventArgs e)
{
if (_client != null)
{
_client.Disconnect();
}
_client.Dispose();
} //利用回调的方式读取高级结构体数据
private void btn_ReadStruct_Click_1(object sender, EventArgs e)
{
_notificationHandleStruct2 = _client.AddDeviceNotificationEx("GVL.stAxis", AdsTransMode.OnChange, 1, 0, this, typeof(Plc_StAxisInfo)); } //写高级结构体
private void btn_WriteStruct_Click(object sender, EventArgs e)
{
Plc_StAxisInfo plcStAxis = new Plc_StAxisInfo();
plcStAxis.Axis = new Plc_StAxis[10];
plcStAxis.Axis[0].ToDriverIO = 26;
plcStAxis.Axis[1].ToDriverIO = 36;
plcStAxis.Axis[2].ToDriverIO = 46;
plcStAxis.Axis[3].ToDriverIO = 56;
plcStAxis.Axis[4].ToDriverIO = 66;
plcStAxis.Axis[5].ToDriverIO = 76;
plcStAxis.Axis[6].ToDriverIO = 86;
plcStAxis.Axis[7].ToDriverIO = 96;
plcStAxis.Axis[8].ToDriverIO = 106;
_client.WriteAny(_handleStruct2, plcStAxis);//写入值到设备中
} //readonly方式
private void btnReadAnyStruct_Click(object sender, EventArgs e)
{
Plc_StAxisInfo plcStAxis = (Plc_StAxisInfo)_client.ReadAny(_handleStruct2, typeof(Plc_StAxisInfo));
foreach (Plc_StAxis plc_StAxis in plcStAxis.Axis)
{
//获取结构体中的所有字段
FieldInfo[] fieldInfos = typeof(Plc_StAxis).GetFields();
int FieldCount = fieldInfos.Length;
for (int i = 0; i < FieldCount; i++)
{
if (fieldInfos[i].FieldType.Name == "Byte[]")
{
byte[] b = (byte[])fieldInfos[i].GetValue(plc_StAxis);
foreach (var item in b)
{
Debug.WriteLine(item.ToString());
}
}
else if (fieldInfos[i].FieldType.Name == "Double[]")
{
double[] d = (double[])fieldInfos[i].GetValue(plc_StAxis);
foreach (var item in d)
{
Debug.WriteLine(item.ToString());
}
}
else
{
//获取字段值
Debug.WriteLine(fieldInfos[i].GetValue(plc_StAxis));
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace AdsProject
{
//对于一些超复杂的结构体,使用普通DataStream是很难读取的,比较方便的方式是申请一个同等大小的结构体,然后用readany读取
//PLC-->c#:BOOL--->bool, UINT--->Uint16, DWORD--->int32,LREAL-->Double,UDINT--->Uint32,ARRAY--->数组 [StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct Plc_StAxis
{
//UINT
[MarshalAs(UnmanagedType.U2)]
public UInt16 DriverIO;
[MarshalAs(UnmanagedType.U2)]
public UInt16 DriverErrorID; //BOOL
[MarshalAs(UnmanagedType.I1)]
public bool Q_Brake;
[MarshalAs(UnmanagedType.I1)]
public bool AxisCamDog1;
[MarshalAs(UnmanagedType.I1)]
public bool AxisCamDog2;
[MarshalAs(UnmanagedType.I1)]
public bool LimitP;
[MarshalAs(UnmanagedType.I1)]
public bool LimitN;
[MarshalAs(UnmanagedType.I1)]
public bool HOME;
[MarshalAs(UnmanagedType.I1)]
public bool HomingDirection;
[MarshalAs(UnmanagedType.I1)]
public bool EXT1; //DWORD
[MarshalAs(UnmanagedType.U4)]
public UInt32 ToDriverIO; //BOOL
[MarshalAs(UnmanagedType.I1)]
public bool ServoOn_HMI;
[MarshalAs(UnmanagedType.I1)]
public bool ServoOnInt;
[MarshalAs(UnmanagedType.I1)]
public bool Homing_HMI;
[MarshalAs(UnmanagedType.I1)]
public bool HomingInt;
[MarshalAs(UnmanagedType.I1)]
public bool BrakeBtn_HMI;
[MarshalAs(UnmanagedType.I1)]
public bool Inch_HMI;
[MarshalAs(UnmanagedType.I1)]
public bool JogF_HMI;
[MarshalAs(UnmanagedType.I1)]
public bool JogB_HMI;
[MarshalAs(UnmanagedType.I1)]
public bool StationIni;
[MarshalAs(UnmanagedType.I1)]
public bool AutoPStart_HMI;
[MarshalAs(UnmanagedType.I1)]
public bool StopCond;
[MarshalAs(UnmanagedType.I1)]
public bool ServoOn_L;
[MarshalAs(UnmanagedType.I1)]
public bool OriginOk_L;
[MarshalAs(UnmanagedType.I1)]
public bool SingleCycle;
[MarshalAs(UnmanagedType.I1)]
public bool Busy; //LREAL
[MarshalAs(UnmanagedType.R8)]
public double ActPos;
[MarshalAs(UnmanagedType.R8)]
public double AutoPosition; //DWORD
[MarshalAs(UnmanagedType.U4)]
public UInt32 Alarm1;
//DINT
[MarshalAs(UnmanagedType.U4)]
public UInt32 ErrorID; //BOOL
[MarshalAs(UnmanagedType.I1)]
public bool ActionEnable; //轴可动作
[MarshalAs(UnmanagedType.I1)]
public bool ActionM; //轴手动基本条件
[MarshalAs(UnmanagedType.I1)]
public bool PosEnable;
[MarshalAs(UnmanagedType.I1)]
public bool PosEnableM;
[MarshalAs(UnmanagedType.I1)]
public bool BackAutoPosEN;
[MarshalAs(UnmanagedType.I1)]
public bool Homing; //轴回原点
[MarshalAs(UnmanagedType.I1)]
public bool MotionMethod; //轴初始化回原点
[MarshalAs(UnmanagedType.I1)]
public bool ServoOn_M; //伺服ON
[MarshalAs(UnmanagedType.I1)]
public bool Inch_M; //寸动
[MarshalAs(UnmanagedType.I1)]
public bool JogF_M; //正向微动
[MarshalAs(UnmanagedType.I1)]
public bool JogB_M; //反向微动
[MarshalAs(UnmanagedType.I1)]
public bool AutoPStart_M; //轴自动停位启动
[MarshalAs(UnmanagedType.I1)]
public bool BrakeBtn_M; //刹车
[MarshalAs(UnmanagedType.I1)]
public bool GrabSafetyPos;
[MarshalAs(UnmanagedType.I1)]
public bool PlacedSafetyPos; // //ARRAY[1..10] OF BYTE
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] PosHandStart; //轴手动启动
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] PosHandStartM; //轴手动启动
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] PosAutoStart; //轴自动启动
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] PosStart_M; //轴启动
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] Position_L; //轴位指示
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] PosHandEnable; //轴手动条件 //LREAL
[MarshalAs(UnmanagedType.R8)]
public double VelocityTotal; //速度汇总
[MarshalAs(UnmanagedType.R8)]
public double OriginCompensation; //原点补偿
[MarshalAs(UnmanagedType.R8)]
public double InchingLength; //寸动长度
[MarshalAs(UnmanagedType.R8)]
public double Override; //速度倍率
[MarshalAs(UnmanagedType.R8)]
public double JogVelocity; //微动速度
[MarshalAs(UnmanagedType.R8)]
public double VelocityManual; //轴手动速度
[MarshalAs(UnmanagedType.R8)]
public double VelocityAuto; //轴自动速度
[MarshalAs(UnmanagedType.R8)]
public double VelocityAutoM; //轴自动速度M
[MarshalAs(UnmanagedType.R8)]
public double VelocityDebug; //调试速度
[MarshalAs(UnmanagedType.R8)]
public double HomingVelocity; //原点补偿与寸动速度
[MarshalAs(UnmanagedType.R8)]
public double ErrorRangeSet; //轴误差范围设定 [MarshalAs(UnmanagedType.I4)]
public Int32 AlarmCount; //报警计数 //ARRAY[1..10] OF LREAL
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public double[] PositionSet; //LREAL
[MarshalAs(UnmanagedType.R8)]
public double DTerminalVelocity; //对端子速度
[MarshalAs(UnmanagedType.R8)]
public double TerminalvelocityManual; //对端子手动速度
[MarshalAs(UnmanagedType.R8)]
public double TerminalvelocityAuto; //对端子自动速度 }
//GVL中的stAxis数组
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct Plc_StAxisInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public Plc_StAxis[] Axis;
}
}
倍福plc端
StAixis代码:
(********************************************************************)
//结构体数据说明:
//备注:
(********************************************************************) TYPE stAxis :
STRUCT
DriverIO AT%I*:UINT; //与驱动器Digital inputs关联
DriverErrorID AT%I*:UINT; //与驱动器Error code关联
// ModelOperation AT%Q*:SINT; //操作模式与驱动器Model of operation关联
Q_Brake AT%Q*:BOOL; //刹车
AxisCamDog1 AT%Q*:BOOL; //凸轮轴原点接近1
AxisCamDog2 AT%Q*:BOOL; //凸轮轴原点接近2
LimitP :BOOL; //正极限
LimitN :BOOL; //负极限
HOME :BOOL; //原点
HomingDirection :BOOL; //回原点方向
EXT1 :BOOL; //外部锁存
ToDriverIO :DWORD;//驱动器IO数据位 ServoOn_HMI :BOOL; //伺服ON按钮
ServoOnInt :BOOL; //初始化伺服ON
Homing_HMI :BOOL; //回原点启动
HomingInt :BOOL; //初始化回原点
BrakeBtn_HMI :BOOL; //刹车
Inch_HMI :BOOL; //寸动
JogF_HMI :BOOL; //正向微动
JogB_HMI :BOOL; //反向微动
StationIni :BOOL; //轴所在工位初始化中
AutoPStart_HMI :BOOL; //轴自动停位启动
StopCond :BOOL; //轴停止条件 ServoOn_L :BOOL; //伺服ON_L
OriginOk_L :BOOL; //原点OK标志
SingleCycle :BOOL; //轴所在工位单循环
Busy :BOOL; //轴忙
ActPos :LREAL;//轴当前实际位置
AutoPosition :LREAL;//轴自动停位
Alarm :DWORD; //报警:00伺服报警 01负极限异常 02正极限异常 03原点接近异常 04轴未找到原点 05轴不在自停位 06伺服驱动器异常 08轴未伺服On
ErrorID :UDINT; ActionEnable :BOOL; //轴可动作
ActionEnableM :BOOL; //轴可动作M
PosEnable :BOOL; //轴手动基本条件
PosEnableM :BOOL; //轴手动基本条件M
BackAutoPosEN :BOOL; //轴可自动回自停位
Homing :BOOL; //轴回原点
MotionMethod :BOOL; //运动方式 0相对1绝对
ServoOn_M :BOOL; //伺服ON
Inch_M :BOOL; //寸动
JogF_M :BOOL; //正向微动
JogB_M :BOOL; //反向微动
AutoPStart_M :BOOL; //轴自动停位启动
BrakeBtn_M :BOOL; //刹车 GrabSafetyPos :BOOL; //抓取安全位
PlacedSafetyPos :BOOL; //放料安全位 PosHandStart :ARRAY[1..10] OF BOOL; //轴手动启动
PosHandStartM :ARRAY[1..10] OF BOOL; //轴手动启动
PosAutoStart :ARRAY[1..10] OF BOOL; //轴自动启动
PosStart_M :ARRAY[1..10] OF BOOL; //轴启动
Position_L :ARRAY[1..10] OF BOOL; //轴位指示 PositionDone :BOOL; //轴动作完成 PosHandEnable :ARRAY[1..10] OF BOOL; //轴手动条件 VelocityTotal :LREAL;//速度汇总
//
originCompensation :LREAL;//原点补偿 InchLength :LREAL;//寸动长度
Override :LREAL;//速度倍率
JogVelocity :LREAL;//微动速度
VelocityManual :LREAL;//轴手动速度
VelocityAuto :LREAL;//轴自动速度
VelocityAutoM :LREAL;//轴自动速度M
VelocityDebug :LREAL;//调试速度
HomeVelocity :LREAL;//原点补偿与寸动速度
ErrorRangeSet :LREAL;//轴误差范围设定
AlarmCount :DINT; //报警计数 PositionSet :ARRAY[1..10] OF LREAL;//轴位置设置 DTerminalVelocity :LREAL;//对端子速度
TerminalvelocityManual :LREAL;//对端子手动速度
TerminalvelocityAuto :LREAL;//对端子自动速度
END_STRUCT
END_TYPE
Struct_Data结构体代码
TYPE Struct_Data :
STRUCT
StrData:INT:=45;
StrByte:BYTE:=45;
strFloat:REAL:=45.0;
END_STRUCT
END_TYPE
MAIN(PRO)代码:
PROGRAM MAIN
VAR
Data_Cloud1: LREAL := 0;
Data_Cloud2: LREAL := 0;
bTestData:ARRAY[0..15] OF BOOL;
dData2:ARRAY[0..15] OF LREAL;
nTest:INT:=0; //c# test
Data_Bool : BOOL:=TRUE;
Data_Byte : BYTE:=120;
Data_Int : INT:=45;
Data_Array : ARRAY [1..4] OF INT:=[256,128,456,789];
Data_Struct : Struct_Data; nEventBool AT %MW10: BOOL;
nEventByte AT %MW20: BYTE; fbMathTest:FB_Math;
END_VAR
AdsStream的使用的更多相关文章
- 倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码
倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码 本次测试需要环境: VS2013,TwinCAT3(本人版本TC31-Full-Setup.3.1.4018.16) 代 ...
- 倍福Ads协议通信测试
测试环境:vs2015 + TC31-Full-Setup.3.1.4022.30.exe 首先需要安装TC31-Full-Setup.3.1.4022.30.exe 本例子是用本机作测试,如果使用远 ...
随机推荐
- 第七十五篇:Vue兄弟组件传值
好家伙, 兄弟组件的传值用到Eventbus组件, 1.EventBus的使用步骤 ① 创建 eventBus.js 模块,并向外共享一个Vue的实例对象 ②在数据发送方, 调用bus.$emit(' ...
- openstack中Keystone组件简解
一.Keystone服务概述 在Openstack框架中,keystone(Openstack Identity Service)的功能是负责验证身份.校验服务规则和发布服务令牌的,它实现了Opens ...
- 诺塔斯读写卡QT SDK笔记
卡片操作函数调用 寻卡: Request --> LotusCardRequest 防撞处理: Anticollission --> LotusCardAnticoll 选卡: Selec ...
- KingbaseES 的闪回查询
KingbaseES V008R006C006B0013版本新增支持闪回查询,闪回版本查询.闪回表到指定时间点.旧版本已支持闪回回收站技术. 闪回技术(闪回查询和闪回表到指定时间点)可以通过时间戳和C ...
- PostgreSQL 绑定变量窥探
今天我们要探讨的是 custom执行计划和通用执行计划.这一技术在 Oracle中被称为绑定变量窥视.但 Kingbase中并没有这样的定义,更严格地说,Kingbase叫做custom执行计划和通用 ...
- KingbaseES 参数 - ignore_char_null_check
KingbaseES 基于PostgreSQL进行了大量的Oracle兼容性开发,为了能同时兼容Oracle 和 PG 的特性,增加参数进行控制.以下介绍 KingbaseES 下特有的参数 igno ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:6、微服务间的调用方式:Rpc.StartTaskAsync。
系统目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- winform,水晶报表制作
1.安装最新的 SP:(SP 29 示例 – https://origin.softwaredownloads.sap.com/public/file/0020000001636412020) 2.新 ...
- Windows Server体验之应用兼容性按需功能
Windows Server默认仅能支持几个有图形界面的应用包括注册表编辑器regedit.记事本notepad.任务管理器taskmgr.时间设置control timedate.cpl.区域设置c ...
- 不停机为虚拟机添加主机磁盘(以VMware Workstation为例)
VMware Workstation软件上安装的centos7系统,新增磁盘后使用fdisk -l命令查看不到新增的磁盘,有没有办法在不重启的情况下添加上新磁盘? 有办法 具体如下: # 查看主机总线 ...