【问题标题】:How to get symbols from TwinCAT in windows 10?如何在 windows 10 中从 TwinCAT 获取符号?
【发布时间】:2021-02-18 08:48:56
【问题描述】:

我必须在实时模式下使用 Beckhoff I/O(不是 PLC 项目),因为最终目标是制作一个 Soft-PLC,程序在电脑上而不是 Beckhoff 上运行。所以在 Visual Studio 中,我编写了 ac# 代码,它在后台打开一个现有的 TwinCAT 项目(带有一个任务和一些链接的变量),激活配置,然后从该任务中获取符号,这样我就可以使用它们来实时控制变量(例如读取输入或写入输出)。问题是我无法获得符号! (我使用 SymbolLoaderFactory.Create 方法)。我在同一个命名空间中创建了一个“控制”类,其中包含一些方法,如 GoConfig()、Open()、Activate() 等。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EnvDTE;
using System.IO;
using TCatSysManagerLib;
using System.Management;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Collections;
using System.Xml;
using TwinCAT.Ads;
using TwinCAT.Ads.ValueAccess;
using TwinCAT.Ads.TypeSystem;
using TwinCAT.TypeSystem;


namespace TCControl
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            
            string solName = "solution1"; 
            string solPath = $@"B:\...solutionPath...\{solName}";

            string[] terminal = new string[1];
            terminal[0] = "EK1100";

            string ipAddress = "10.157.4.69.1.1";
            int port = 301;

            Controlling co = new Controlling();
            MessageFilter.Register();
            

            //go to configuration mode
            co.GoConfig(ipAddress);

            
            //open the solution
            string[,] treeItemsandTypes = co.Open(solPath, solName, ipAddress, terminal);
            co.Activate(solPath, solName);
            
            //obtain symbols
            ISymbolLoader symbolLoader = co.SymbolsGetter(ipAddress, port);

            ISymbol[] symbols = new ISymbol[symbolLoader.Symbols.Count];
            
            int i = 0;
            foreach (ISymbol symbol in symbolLoader.Symbols)
            {
                symbols[i] = symbol;
                i++;
            }
            
            Console.WriteLine("\n" + symbols[0].ToString());
            Console.WriteLine("\n" + symbols[1].ToString());

我创建的所有用于测试的项目都有 2 个与任务相关联的变量。 在 SymbolsGetter 方法之前一切正常。来自控制类:

public ISymbolLoader SymbolsGetter(string indirizzo, int port)
        {
            using (TcAdsClient client = new TcAdsClient())
            {
                System.Threading.Thread.Sleep(2000);
                client.Connect(indirizzo, port);

                //Creates the Symbol Objects as hierarchical tree
                SymbolLoaderSettings settings = new SymbolLoaderSettings(SymbolsLoadMode.Flat, ValueAccessMode.IndexGroupOffsetPreferred);

                ISymbolLoader symbolLoader = SymbolLoaderFactory.Create(client, settings);

                //System.Threading.Thread.Sleep(2000);
                return symbolLoader;
            }
        }
    

Thread.Sleep 是因为否则 client.Connect 会产生错误。 如果我在“return symbolLoader”上添加一个断点,并且如果我用鼠标移过它以查看(symbolLoader)的值,它只能在调试中工作。 我试图插入另一个睡眠,但没有,它不起作用。我实际上开始认为这是黑魔法。 另一个问题是我无法从所有项目中获取符号(使用之前的调试技术)。即使它有效,我也不能使用符号的名称向该变量写入高/低信号。所以没有任何工作,我只能创建和打开一个项目、一个任务等。 还有一个信息:我使用的是 windows 10(也许 TwinCAT 在 windows 7 或 xp 上运行得更好,但我必须让它在 windows 10 上运行)。 我必须在不触摸或查看 TwinCAT 项目窗口的情况下完成所有操作,它必须保持在后台。我不是程序员,我对 Beckhoff/TwinCAT 世界还很陌生。如果有人可以帮助我,我会非常感谢他。

【问题讨论】:

    标签: c# windows real-time symbols twincat


    【解决方案1】:

    如果您想使用 Beckhoff 的 ADS 库您不能没有在后台使用 Beckhoff PLC-Runtime。

    使用 ADS-lib,您可以访问具有 Ethercat 主站的 PLC 运行系统中的符号,通过该主站可以与 Beckhoff Ethercat IO 进行通信。

    如果您不想使用 Beckhoff Plc-Runtime(我不太清楚您为什么不想要),您需要另一种 Ethercat Master 来与 IO 通信。

    我必须在实时模式下使用 Beckhoff I/O(不是 PLC 项目),因为最终目标是制作一个 Soft-PLC,程序在电脑上而不是 Beckhoff 上运行。

    这很令人困惑,因为 Beckhoff 运行时运行在 Windows 之外的计算机上。 如果您想在没有实时功能的情况下控制 IO,您可以购买 Advantech PCI IO 卡并使用他们的 c# sdk。

    如果没有 Beckhoff 运行时在后台,您将无法使用 c# 访问 Beckhoff IO。 Twincat 在 windows 7 或 xp 上并不能更好地工作,事实上 windows xp 甚至不支持 Twincat 3,新机器出于安全和支持原因仅使用 windows 10。

    【讨论】:

    • 是的,我说我是这个世界的新手 :) 我实际上是在后台使用 plc-runtime。最后我解决了这个问题(SymbolLoaderFactory.Create创建的symbolLoader结构很复杂,像一棵树,要访问symbols就需要深入内部。我研究了dumpSymbols方法是如何工作的。并且正确调用SymbolsGetter 函数我只需要在调用之前创建一个新的 ISymbolLoader 实例)。还是谢谢你的回答
    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2017-12-14
    • 2020-04-08
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多