【发布时间】:2016-01-07 00:05:39
【问题描述】:
让我解释一下我的应用程序,以便让读者了解我实际在做什么。
我正在将 MVC5 与 signalR 一起用于 Web 应用程序。
该应用程序包含一个客户端到服务器的连接。另一方面,服务器也有一个连接到 PLC(可编程逻辑控制器)的控制器,它是一个带有硬件 IO 的简单硬件控制器。
我正在使用 SignalR 写入 plc,如下所示: 客户端 (JS) -> SignalRHub -> MVC 控制器 -> PLC
我还需要服务器在PLC发生变化时广播如下: PLC -> MVC 控制器 -> SignalRHub -> 客户端。
MVC 控制器有一个事件,当 plc 发生变化时它会被触发。
问题是,当客户端连接正常时,它确实创建了一个 SignalRHub 的实例,但是当它准备好时,集线器被破坏,因此如果 PLC 上发生更改,它会完全丢失并且无法推送到客户端。
客户端代码为:
$(document).ready(function () {
var chat = $.connection.chatHub;
console.log(chat);
chat.client.writeMessage = function (msg) {
console.log(msg);
}
var i = $.connection.hub.start().then(function (event) {
$('#send').click(function () {
console.log("clicked");
chat.server.plcWrite(true);
});
});
});
这意味着(据我所知)在文档准备就绪时创建集线器连接,并且当单击按钮#send 时写入 plc,它工作得非常好。
这是集线器代码:
Controllers.PlcController plc = new Controllers.PlcController();
//public void bMessage()
//{
// Clients.All.writeMessage(x);
// }
public void plcWrite(bool write)
{
plc.plcWritebool(write);
plc._broadcast += plc__broadcast;
}
void plc__broadcast(object sender, EventArgs e)
{
bool s = plc.plcRead();
Clients.All.broadcast(s);
}
我正在阅读的问题是,当客户端单击按钮时,它总是会创建一个新控制器,并且在准备好时会丢失。
有没有人知道让集线器始终保持不变并始终与我的控制器保持连接?希望解释清楚,如果您需要更多信息,请随时询问!
编辑:我知道我可以从客户端使用轮询频率,但它会产生大量流量,而且每次轮询时我都必须访问 plc,这不是那么灵活。 plc有变化最好更新客户端!
问候
【问题讨论】: