【博图TIA-Api】自动填充程序账号密码打开项目
思路
- 调用TIA的Api接口
- 实现方式为C#的“Windows 窗体应用(.NET Framework),(默认PC已经装了Visual Studio)
- 作为打开方式打开,即不直接用TIA打开项目,而是调用接口打开项目
- 西门子子接口使用文档(中文的) 点击链接进入
前期准备
安装TIA Portal Openness
此软件一般在安装TIA时会自动安装,可以打开TIA进行确认。
TIA Portal Openness组用户设置
必须把操作用户加入到TIA Portal Openness组,不然没有权限使用。
改了之后用户必须重新登陆才生效,建议直接重启,或者注销也行。
【计算机管理】-【本地用户和组】-【组】-【Siemens TIA Openness】-添加本机用户
C#项目添加引用(Dll文件)
博图在安装过程中,默认整合了TIA版本及其低版本的所有引用。
具体路径为C:\Program Files\Siemens\Automation\Portal V16\PublicAPI
只要选择这两个文件即可
打开Visual Studio,添加引用,最终效果如图。
部分准备
新建项目
直接选择窗体应用新建即可。
获取文件路径
如果作为打开方式,必须获取打开文件的路径才行。
首先打开主程序
修改程序,设置主程序的输入参数为字符串,其实就是获取文件路径。
获取到路径之后,如果是文件,就把路径传到我们新建的页面里面。(注意if的打开窗口里面有一个带了args[0]的参数)
不是文件也可以打开页面,判断可以放到页面里面也可以直接放主程序,我这里是在页面中。
static void Main(string[] agrs)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (agrs.Length >= 1)//表示有文件或命令行
{
//看看是不是文件
if (System.IO.File.Exists(agrs[0]))
{
//传递路径到页面中
Application.Run(new FirstPage(agrs[0]));
}
else MessageBox.Show("无效的文件!");
}
else
{
Application.Run(new FirstPage());//没有文件,正常打开。
}
//Application.Run(new FirstPage());
}
代码添加Using
打开项目的页面
调用TIA的库,建议直接把整个复制进去,免得少了又得加。
#region 引用Siemens
using Siemens.Engineering;
using Siemens.Engineering.HW;
using Siemens.Engineering.HW.Features;
using Siemens.Engineering.HW.Utilities;
using Siemens.Engineering.SW;
using Siemens.Engineering.SW.Blocks;
using Siemens.Engineering.SW.TechnologicalObjects;
using Siemens.Engineering.SW.TechnologicalObjects.Motion;
using Siemens.Engineering.SW.ExternalSources;
using Siemens.Engineering.SW.Tags;
using Siemens.Engineering.SW.Types;
using Siemens.Engineering.Hmi;
using Siemens.Engineering.Hmi.Tag;
using Siemens.Engineering.Hmi.Screen;
using Siemens.Engineering.Hmi.Cycle;
using Siemens.Engineering.Hmi.Communication;
using Siemens.Engineering.Hmi.Globalization;
using Siemens.Engineering.Hmi.TextGraphicList;
using Siemens.Engineering.Hmi.RuntimeScripting;
using Siemens.Engineering.Online;
using Siemens.Engineering.Compiler;
using Siemens.Engineering.Library;
using Siemens.Engineering.Library.Types;
using Siemens.Engineering.Library.MasterCopies;
using Siemens.Engineering.Compare;
using System.Security;
using System.Security.Cryptography;
using System.Management;
using System.Net;
#endregion
页面主程序修改
首先必须接受项目主程序传递过来的文件路径,这里新建了一个变量用来保存。
由于我们这个当打开方式使用,没必要实际弹出窗体,故直接隐藏,并且不出现在下方任务栏。
PS:如果自己调试过程中就不要隐藏窗体,先屏蔽该指令。一旦出错后台会挂好多进程,而你不去任务管理器看根本不知道。
配置账号和密码
既然让程序自动填充密码,必须的它知道密码。
#region 账户密码-函数
// 打开受 UMAC 保护的项目,提前备好账户名和密码
public static void MyUmacDelegate(UmacCredentials umacCredentials)
{
//密码设置为保密文本类型,使用完后销毁内存
SecureString password = new SecureString();
//定义密码
string strPassWord = "此处填密码";
char[] pChar = strPassWord.ToCharArray();
foreach (char c in pChar)
{
password.AppendChar(c);
}
umacCredentials.Type = UmacUserType.Project;
//定义账户
umacCredentials.Name = "此处填账户";
umacCredentials.SetPassword(password);
}
#endregion
打开项目函数
调用接口,然后打开项目时附带我们之前设置的账号和密码
#region 打开项目-函数
public static void StratOpenProject(string args)
{
//有用户界面的情况下打开
// using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface))
//无用户界面情况下在打开,相当于一个后台进程
// using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithoutUserInterface))
using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface))
{
//打开项目
Siemens.Engineering.Project project = tiaPortal.Projects.Open(new FileInfo(args), MyUmacDelegate);
}
}
#endregion
主流程
注意这个流程位于窗口的加载事件之下
流程详细
- 判断有无文件路径,没有退出
- 判断是不是我们要打开的文件类型(.ap16)
- 启动计时器
- 正常打开项目,自动填充账号密码,打开后自动退出
- 超时自动关闭程序
1.判断有无文件路径,没有退出
//判断有无文件路径--手动无法运行
if (Path == "")
{
MessageBox.Show("应用只能作为打开方式打开项目,无法直接打开!");
System.Environment.Exit(0);
return;
}
2.判断是不是我们要打开的文件类型(.ap16)
//判断是不是博图V16的文件,不是提示后退出程序
string FileType = Path.Substring(Path.Length - 5, 5);
if (FileType==".ap16")
{
;
}
else
{
MessageBox.Show("文件类型错误,文件后缀必须是*.ap16!");
System.Environment.Exit(0);
}
3.启动计时器
//启动定时器
OverTime.Enabled= true;
OverTime.Start();
4.正常打开项目,自动填充账号密码,打开后自动退出
//打开TIA项目
StratOpenProject(Path);
//退出程序
System.Environment.Exit(0);
5.超时自动关闭
#region 超时关闭
//超时则自动关闭程序,暂定1分钟
private void OverTime_Tick(object sender, EventArgs e)
{
TimeCount = TimeCount + 1;
if (TimeCount>=60)
{
OverTime.Enabled = false;
OverTime.Stop();
System.Environment.Exit(0);
}
}
#endregion
使用
编译程序导出的exe,在打开方式里选择生成的exe即可。
源代码
主程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TIA16Start
{
internal static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] agrs)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (agrs.Length >= 1)//表示有文件或命令行
{
//看看是不是文件
if (System.IO.File.Exists(agrs[0]))
{
Application.Run(new FirstPage(agrs[0]));
}
else MessageBox.Show("无效的文件!");
}
else
{
Application.Run(new FirstPage());//没有文件,正常打开。
}
//Application.Run(new FirstPage());
}
}
}
页面程序,多余的Using可去掉,不影响运行。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography; //引用Md5转换功能
#region 引用Siemens
using Siemens.Engineering;
using Siemens.Engineering.HW;
using Siemens.Engineering.HW.Features;
using Siemens.Engineering.HW.Utilities;
using Siemens.Engineering.SW;
using Siemens.Engineering.SW.Blocks;
using Siemens.Engineering.SW.TechnologicalObjects;
using Siemens.Engineering.SW.TechnologicalObjects.Motion;
using Siemens.Engineering.SW.ExternalSources;
using Siemens.Engineering.SW.Tags;
using Siemens.Engineering.SW.Types;
using Siemens.Engineering.Hmi;
using Siemens.Engineering.Hmi.Tag;
using Siemens.Engineering.Hmi.Screen;
using Siemens.Engineering.Hmi.Cycle;
using Siemens.Engineering.Hmi.Communication;
using Siemens.Engineering.Hmi.Globalization;
using Siemens.Engineering.Hmi.TextGraphicList;
using Siemens.Engineering.Hmi.RuntimeScripting;
using Siemens.Engineering.Online;
using Siemens.Engineering.Compiler;
using Siemens.Engineering.Library;
using Siemens.Engineering.Library.Types;
using Siemens.Engineering.Library.MasterCopies;
using Siemens.Engineering.Compare;
using System.Security;
using System.Security.Cryptography;
using System.Management;
using System.Net;
#endregion
namespace TIA16Start
{
public partial class FirstPage : Form
{
public FirstPage(string path = "")
{
InitializeComponent();
//隐藏窗体
this.Hide();
this.ShowInTaskbar = false;
//传递路径
if (path != "")
{
Path = path;
//MessageBox.Show(Path);
}
}
#region 定义变量
string Path = "";
int TimeCount = 0;
#endregion
#region 账户密码-函数
// 打开受 UMAC 保护的项目,提前备好账户名和密码
public static void MyUmacDelegate(UmacCredentials umacCredentials)
{
//密码设置为保密文本类型,使用完后销毁内存
SecureString password = new SecureString();
//定义密码
string strPassWord = "123456";
char[] pChar = strPassWord.ToCharArray();
foreach (char c in pChar)
{
password.AppendChar(c);
}
umacCredentials.Type = UmacUserType.Project;
//定义账户
umacCredentials.Name = "abcde";
umacCredentials.SetPassword(password);
}
#endregion
#region 打开项目-函数
public static void StratOpenProject(string args)
{
//有用户界面的情况下打开
// using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface))
//无用户界面情况下在打开,相当于一个后台进程
// using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithoutUserInterface))
using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface))
{
//打开项目
Siemens.Engineering.Project project = tiaPortal.Projects.Open(new FileInfo(args), MyUmacDelegate);
}
}
#endregion
#region 窗体启动博图
private void FirstPage_Load(object sender, EventArgs e)
{
//启动定时器
OverTime.Enabled= true;
OverTime.Start();
//判断有无文件路径--手动无法运行
if (Path == "")
{
MessageBox.Show("应用只能作为打开方式打开项目,无法直接打开!");
System.Environment.Exit(0);
return;
}
//判断是不是博图V16的文件,不是提示后退出程序
string FileType = Path.Substring(Path.Length - 5, 5);
if (FileType==".ap16")
{
;
}
else
{
MessageBox.Show("文件类型错误,文件后缀必须是*.ap16!");
System.Environment.Exit(0);
}
StratOpenProject(Path);
System.Environment.Exit(0);
}
#endregion
#region 超时关闭
//超时则自动关闭程序,暂定1分钟
private void OverTime_Tick(object sender, EventArgs e)
{
TimeCount = TimeCount + 1;
if (TimeCount>=60)
{
OverTime.Enabled = false;
OverTime.Stop();
System.Environment.Exit(0);
}
}
#endregion
}
}