windows下服务无法读取OPC数据问题解决(通过服务创建用户进程)

博客讲述了在Windows系统下,OPC客户端作为服务启动时因会话ID为0导致无法读取PLC数据的问题。通过调整代码,尝试获取有效会话ID并以用户进程方式创建OPC客户端,最终成功实现服务启动后能够正常读取数据。

最近做项目,windows系统的电脑中,布置一个OPC server,该server会去读取PLC的数据。然后电脑中再布置一个OPC客户端,该客户端通过读取本地OPC服务器的数据,间接的采集到PLC中的数据。然后就出现了问题:如果从命令行启动OPC客户端,那么可以读取数据,如果通过nssm安装OPC客户端,那么开机自启后,OPC客户端就读不到数据了。

经过组内讨论,觉得该问题可能会话ID造成的。因为如果OPC客户端通过nssm(或者sc)安装成服务,开机后以服务形式启动,那么会话ID为0,反之则为1,2等数据值。因为这个OPC客户端必须以开机服务的形式启动,因此如果要解决这个问题,可以在服务中以用户进程的形式去创建OPC客户端。创建用户进程使用CreateProcessAsUser。参考网上的案例,实现形式基本如下:

dwSessionID = WTSGetActiveConsoleSessionId();

    if (FALSE == WTSQueryUserToken(dwSessionID, &hToken))
    {
        printf("WTSQueryUserToken fail,error code is %x\n", GetLastError());
        bRet = false;
        return bRet;
    }

    // 复制令牌
    if (FALSE == DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值