You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Wonderware System Platform及Archestra IDE脚本中获取远程PC时间?

获取远程PC DateTime的方法(Wonderware System Platform)

作为经常处理Wonderware系统集成的开发者,我来分享几种在System Platform里获取远程PC系统时间的靠谱方法,分InTouch Scripting和QuickScript.NET两种场景具体说明:

一、InTouch Scripting 实现方式

InTouch脚本里有两种实用的方案,看你的环境选择:

  • 传统DDE/NetDDE通信
    先确保远程PC开启了DDE服务,然后在InTouch里通过DDE读取系统时间。脚本示例:

    string sRemoteTime;
    // 把RemotePCName替换成目标电脑的名称或IP地址
    sRemoteTime = DDERead("\\\\RemotePCName\\System|DateTime", "", 1000);
    

    提醒:这种方式需要双方防火墙放行DDE相关端口,而且新版Windows系统里可能需要额外配置NetDDE的权限,适合老项目兼容。

  • 调用Windows API(更稳定)
    NetRemoteTOD这个API直接获取远程时间,权限配置到位的话比DDE可靠。先在脚本里声明API:

    [DLLImport("netapi32.dll")]
    function long NetRemoteTOD(string UncServerName, ref long BufferPtr);
    [DLLImport("netapi32.dll")]
    function long NetApiBufferFree(long BufferPtr);
    

    然后编写获取逻辑:

    long hBuffer;
    long lResult;
    // 替换成远程PC的UNC路径,比如\\192.168.1.100
    string sRemotePC = "\\\\192.168.1.100";
    lResult = NetRemoteTOD(sRemotePC, hBuffer);
    if (lResult == 0) {
        // 这里需要解析缓冲区里的TOD结构转换成可读的时间格式
        // 记得最后一定要释放缓冲区,避免内存泄漏
        NetApiBufferFree(hBuffer);
    }
    

    提示:运行InTouch的用户必须有远程PC的访问权限,比如读取系统时间的权限。

二、QuickScript.NET 实现方式

QuickScript.NET基于.NET框架,能用的工具更多,首推WMI查询:

  • WMI查询(推荐)
    .NET对WMI的支持很完善,通过查询远程PC的Win32_OperatingSystem类就能拿到时间。代码示例:

    using System.Management;
    
    public string GetRemoteDateTime(string strPCName, string strUsername, string strPassword)
    {
        ConnectionOptions connOptions = new ConnectionOptions();
        connOptions.Username = strUsername;
        connOptions.Password = strPassword;
        
        // 构建远程WMI连接范围
        ManagementScope mgmtScope = new ManagementScope($"\\\\{strPCName}\\root\\cimv2", connOptions);
        mgmtScope.Connect();
        
        // 查询本地时间
        ObjectQuery timeQuery = new ObjectQuery("SELECT LocalDateTime FROM Win32_OperatingSystem");
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(mgmtScope, timeQuery);
        
        foreach (ManagementObject obj in searcher.Get())
        {
            string strRemoteTime = obj["LocalDateTime"].ToString();
            // 把WMI的时间格式转换成.NET DateTime
            DateTime dtRemote = ManagementDateTimeConverter.ToDateTime(strRemoteTime);
            return dtRemote.ToString("yyyy-MM-dd HH:mm:ss");
        }
        return "获取远程时间失败";
    }
    

    调用的时候直接传参数就行:

    string strRemoteTime = GetRemoteDateTime("192.168.1.100", "RemoteAdmin", "YourPassword");
    

    注意:远程PC要开启WMI服务,防火墙放行135端口和WMI动态端口,且提供的用户有远程WMI访问权限。

  • 自定义Socket服务(特殊场景)
    如果WMI配置太麻烦,可以在远程PC上写个轻量的Socket服务,启动后监听某个端口,收到请求就返回当前系统时间。然后在QuickScript.NET里通过Socket连接读取返回值。这种方式适合对权限控制有特殊要求的场景,但需要额外开发远程端的小服务。

三、通用注意事项

  • 权限:无论用哪种方法,运行脚本的用户必须拥有远程PC的对应权限(读取系统时间、WMI访问、DDE访问等)。
  • 防火墙:一定要确保远程PC的防火墙允许对应的通信端口,不然会连接失败。
  • 网络:局域网内两台PC必须能互相ping通,网络连接稳定是基础。

内容的提问来源于stack exchange,提问作者Mikhail Kolmykov

火山引擎 最新活动