c# wpf上位機實現和下位機tcp通訊
下位機使用北京大華程式控制電源dh1766-1,上位機使用wpf。實現了電壓電流實時採集,曲線顯示。上午在公司除錯成功,手頭沒有程式控制電源,使用tcp服務端模擬。昨天寫的tcp服務端正好排上用場。
介面如下:
服務端服務端實在上篇基礎上實現的。需要做如下更改:
複製**
while (true)
string receivestr = encoding.default.getstring(bufferdate, 0, reallen);
switch (receivestr)
this.invoke(addtextdelegate, receivestr + "from" + psocket.remoteendpoint.tostring() + "\r\n");
}catch (exception ex)
}
複製**
在while迴圈中加入:
switch (receivestr)
private addtextdelegate addtextdelegate;
private listsocketlist = new list();
public delegate void addtextdelegate(string text);
private void addtext(string text)
random r = new random();
private void btnstart_click(object sender, eventargs e)
string receivestr = encoding.default.getstring(bufferdate, 0, reallen);
switch (receivestr)
this.invoke(addtextdelegate, receivestr + "from" + psocket.remoteendpoint.tostring() + "\r\n");
}catch (exception ex)}})
.start(proxsocket);
}});
thread.isbackground = true;
thread.start(socket);
}private void btnsend_click(object sender, eventargs e)}}
}複製**
上位機實現客戶端功能。具體如下:
1、欄位和屬性
public readonly ipendpoint tagetipep;
public bool isconnected = false;
private socket socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp) ;
private thread reclistenthread;
public string receivestr
public byte receivebyte
tagetipep是伺服器位址和埠。
isconnected是連線的狀態,這個比較重要,在傳送和接收時,都要更加isconnected進行,並更新isconnected。
socket用於和客戶端通訊。
reclistenthread是監聽客戶端訊息的執行緒。
receivestr和receivebyte用來儲存客戶端發來的訊息。
2、方法函式
連線方法:
複製**
public bool connect()
;
//iasyncresult connresult = socket.beginconnect(tagetipep.address, tagetipep.port, null, null);
true);
//if (connresult.iscompleted)
//return;}}
catch (exception ex)
return;}}
});
reclistenthread.start();
return true;
//}}
catch (exception ex)
return false;
}
複製**
連線函式返回值為bool型別,根據返回值判斷連線是否成功連線。這裡每次連線都例項化了乙個socket,因為在執行socket.close()後,重新開啟會失敗,而斷線重連會經常用到,沒有找到更好的方法,乾脆重新例項化socket。連線成功後,開啟監聽服務端訊息的執行緒。這裡使用了乙個receiveevent()事件,在接收到訊息時會觸發這個事件,重新整理ui介面。
傳送方法:
複製**
public bool send(string msg)
catch (exception ex)}}
return false;
}
複製**
關閉方法:
複製**
public void close()
}
複製**
在出現異常時呼叫
訊息接收事件:
public event action receiveevent;
每次接收訊息時觸發,獲取屬性receivestr和receivebyte的值,重新整理ui介面。
完整**:
複製**
public class tcpclient
public readonly ipendpoint tagetipep;
public bool isconnected = false;
private socket socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp) ;
public bool connect()
;//iasyncresult connresult = socket.beginconnect(tagetipep.address, tagetipep.port, null, null);
true);
//if (connresult.iscompleted)
//return;}}
catch (exception ex)
return;}}
});
reclistenthread.start();
return true;
//}}
catch (exception ex)
return false;
}public bool send(string msg)
catch (exception ex)}}
return false;
}public event action receiveevent;
public string receivestr
public byte receivebyte
public void close()
}private thread reclistenthread;
}
複製**
前台呼叫,宣告timer定時器,每個一秒觸發一次。觸發事件如下:
複製**
private string flag = "";
private void querytimer_elapsed(object sender, system.timers.elapsedeventargs e)
flag = "v";
thread.sleep(50);
if (!tcp.send("meas:curr:all?\n"))
flag = "c";
#region 測試
//angle += 18;
//if (angle > 360)
//#endregion
}
複製**
重新整理ui介面的事件如下:
複製**
private void tcp_receiveevent()
#region 測試
//voltvalue = math.round(math.sin((angle) * pi / 180) * 16 + 16, 3);
//currentvalue = math.round(math.sin((angle) * pi / 180) * 2.5 + 2.5, 3);
#endregion
voltvalues.add(voltvalue);
currentvalues.add(currentvalue);
if (voltvalues.count > 30)
});});
}
C WPF上位機實現和下位機TCP通訊
c wpf上位機實現和下位機tcp通訊 下位機使用北京大華程式控制電源dh1766 1,上位機使用wpf。實現了電壓電流實時採集,曲線顯示。上午在公司除錯成功,手頭沒有程式控制電源,使用tcp服務端模擬。昨天寫的tcp服務端正好排上用場。介面如下 服務端服務端實在上篇基礎上實現的。需要做如下更改 複...
上位機 下位機
上位機是指 人可以直接發出操控命令的計算機,一般是pc,螢幕上顯示各種訊號變化 液壓,水位,溫度等 下位機是直接控制裝置獲取裝置狀況的的計算機,一般是plc 微控制器之類的。上位機發出的命令首先給下位機,下位機再根據此命令解釋成相應時序訊號直接控制相應裝置。下位機不時讀取裝置狀態資料 一般模擬量 轉...
上位機與下位機
上位機一般是集中管理監控機,下位機是指現場直接控制器或控制機。上位機面向管理級使用者,下位機面向底層裝置控制。上位機 上位監視系統,一般為計算機系統 監控軟體 下位機 控制系統的現場執行系統,一般為plc等裝置。上位機是指人可以直接發出操控命令的計算機,一般是pc,螢幕上顯示各種訊號變化 液壓,水位...