TwinCAT 2.11:使用Win32-Application设置Config / Freerun-Mode

时间:2014-05-07 09:05:41

标签: .net configuration twincat ethercat twincat-ads-.net

我在Windows XP SP2上使用TwinCAT I / O 2.11。使用.NET-Library“TwinCAT.ADS”,我已经设法读取和写入输入/输出(来自EtherCAT总线上设备的映射对象)。但当然这仅适用于TwinCAT处于Freerun或实时模式时。

我现在的问题是:我可以手动设置TwinCAT模式。 但是如何使用Win32程序设置TwinCat模式(Freerun,Realtime,...)?我在TwinCAT.ADS中找不到合适的功能。是否存在这样的功能?

3 个答案:

答案 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)的广告客户端