【发布时间】: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