我找不到在net.connect()
函数中设置local endpoint
字段的方法。我需要将local endpoint
显式设置为特定的 IP 地址。
我正在使用node-ads
库将节点进程连接到PLC设备。
在我的示例中:
ads.tcpClient = net.connect(
ads.options.port,
ads.options.host,
function () {
ads.connected = true
cb.apply(ads.adsClient)
}
)
connect()
函数不提供参数。返回的socket
对象似乎也没有终结点的字段。我做错了什么?
原因是我正在连接到 Beckhoff PLC,如果同一台计算机上已经存在另一个连接,则连接需要不同的主机 IP 地址。问题在这里提到。
我知道在 Beckhoff-ADS C# 实现中是可能的,因为这段代码有效:
var socket = new AmsSocket(targetip, amsport)
{
LocalEndPoint = new IPEndPoint(IPAddress.Parse(sourceip), 0)
};
UPDATE通过执行以下操作解决了该问题:
- 更改
ads.js
文件以显式设置源 IP 地址 - 最好不要在
node_modules
中执行此操作,而只是将ads.js
文件复制到不会被覆盖的地方
位于ads.js
:
var connect = function (cb) {
var ads = this
ads.tcpClient = net.connect({
port: ads.options.port,
host: ads.options.host,
localAddress: ads.options.sourceIp, // the part you have to add
},
在ADS 连接的options
中传递sourceIp
:
public options = {
host: "192.168.100.1",
amsNetIdTarget: "192.168.100.1.1.1",
amsNetIdSource: "192.168.100.105.1.1",
sourceIp: "192.168.100.105",
};
连接到您的 PLC:
const client = ads.connect(this.options, () => {
console.log("Trying to connect.");
client.readDeviceInfo((err, result) => {
if (err) {
console.log("Error: " + err);
}
console.log("Connection result: " + JSON.stringify(result));
client.end();
});
});
足够简单,但不幸的是在节点 ADS 中不受支持。