我在Windows XP SP2上使用TwinCAT I / O 2.11。使用.NET-Library“TwinCAT.ADS”,我已经设法读取和写入输入/输出(来自EtherCAT总线上设备的映射对象)。但当然这仅适用于TwinCAT处于Freerun或实时模式时。
我现在的问题是:我可以手动设置TwinCAT模式。 但是如何使用Win32程序设置TwinCat模式(Freerun,Realtime,...)?我在TwinCAT.ADS中找不到合适的功能。是否存在这样的功能?
答案 0 :(得分:0)
我找到了一个解决方案:命名空间TCatSysManagerLib(来自文件C:\ TwinCAT \ Io \ AddIns \ TCatSysManagerLib.dll)提供了一个名为ITcSysManager的类,它允许您从TwinCAT访问系统管理器功能。
答案 1 :(得分:0)
我只对TwinCAT3有一些经验,但库是一样的。
在TwinCAT3中,我们区分 RUN 和 CONFIG 。要在两种模式之间切换,您需要TCatSysManagerLib,这是真的。但是(特别是对于TwinCAT3)没有方法可以切换回 CONFIG 模式(但......但是Beckhoff正在研究它)。
如果你想这样做,你需要通过10000P的AmsPort.SystemService。
以下是如何从 RUN 切换到 CONFIG 模式的示例:
uint
这里与 CONFIG 到 RUN 模式(使用TCatSysManagerLib)的方式相反: - >仅适用于TwinCAT3
VALUE
或(我还没试过):
public void setConfigMode()
{
TcAdsClient client = new TcAdsClient();
StateInfo mode = new StateInfo();
client.Connect((int)AmsPort.SystemService);
mode.AdsState = AdsState.Reconfig;
client.WriteControl(mode);
client.Dispose();
}
答案 2 :(得分:0)
我已经基于@ChrisKo的答案实施了一个解决方案。以下WinForms代码在以下前提下运行:存在一个名为Form1
的窗体,该窗体具有名为_runButton
,_configButton
和_exitButton
的三个按钮。该项目应具有对TwinCAT.Ads.dll的引用。
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
using TwinCAT.Ads;
namespace TwinCatStateREader
{
public partial class Form1 : Form
{
private TcAdsClient _tcClient;
private TcAdsClient _tcSystemClient;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
_tcClient = new TcAdsClient();
_tcClient.Connect(851);
_tcSystemClient = new TcAdsClient();
_tcSystemClient.Connect((int)AmsPort.SystemService);
if (_tcSystemClient.ReadState().AdsState != AdsState.Run)
{
_configButton.Enabled = false;
_runButton.Enabled = true;
}
else
{
_runButton.Enabled = false;
_configButton.Enabled = true;
}
}
catch (AdsErrorException ex)
{
MessageBox.Show(ex.Message);
}
}
private void _exitButton_Click(object sender, EventArgs e)
{
Close();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
_tcClient.Disconnect();
_tcClient.Dispose();
_tcSystemClient.Disconnect();
_tcSystemClient.Dispose();
}
catch (AdsErrorException ex)
{
MessageBox.Show(ex.Message);
}
}
private void _configButton_Click(object sender, EventArgs e)
{
_configButton.Enabled = false;
_tcSystemClient.WriteControl(new StateInfo(AdsState.Reconfig, _tcSystemClient.ReadState().DeviceState));
if (WaitForState(AdsState.Config, 3000))
{
_runButton.Enabled = true;
}
else
{
_configButton.Enabled = true;
}
}
private void _runButton_Click(object sender, EventArgs e)
{
_runButton.Enabled = false;
_tcSystemClient.WriteControl(new StateInfo(AdsState.Reset, _tcSystemClient.ReadState().DeviceState));
if (WaitForState(AdsState.Run, 3000))
{
_configButton.Enabled = true;
}
else
{
_runButton.Enabled = true;
}
}
private bool WaitForState(AdsState state, int timeOutInMilliSeconds)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
while (stopwatch.ElapsedMilliseconds <= timeOutInMilliSeconds)
{
try
{
if (_tcSystemClient.ReadState().AdsState == state)
{
return true;
}
}
catch (AdsErrorException)
{
// This can happen while ADS changes state and we try to read it
}
finally
{
Thread.Sleep(20);
}
}
stopwatch.Stop();
return false;
}
}
}
请注意,此解决方案使用了两个连接到不同端口(851/10000)的广告客户端