我是新手,想通過C#撰寫一個小程式,實作通過以太網口從工業控制器以太網讀取資料。
目前已知的資訊是,我通過超級終端進行以下設定后(工業控制器的埠號設定與之相同),即可接收到來之工業控制器的資料。

麻煩高手幫忙看看代碼應該怎么寫?謝謝
uj5u.com熱心網友回復:
如果超級終端可以,那么說明它是一個標準的telnet服務器端,你可以參考http://blog.csdn.net/foart/article/details/6833815
uj5u.com熱心網友回復:
謝謝版主,學習中...uj5u.com熱心網友回復:
一個文本式的tcp通訊例子可以這樣寫using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(h => receive());
ThreadPool.QueueUserWorkItem(h => send());
Console.WriteLine("..............................請按任意鍵退出");
Console.ReadLine();
}
private static void send()
{
var s = new TcpListener(IPAddress.Any, port);
s.Start();
var a = s.AcceptTcpClient();
using (var wf = new StreamWriter(a.GetStream()))
{
wf.WriteLine("abc");
wf.WriteLine("你好啊");
wf.WriteLine("じ?ゞ");
}
}
private static string host = "127.0.0.1";
private static int port = 1234;
/// <summary>
/// 首先作為客戶端連接,然后接收資料
/// </summary>
private static void receive()
{
var s = new TcpClient(host, port);
using (var r = new StreamReader(s.GetStream()))
{
while (!r.EndOfStream)
{
var message = r.ReadLine();
Console.WriteLine(message);
}
}
}
}
}
我們談的是比較專業一點的開發。但是對于初學者,其實學的應該是這個。這就好像是幼兒園學的數學跟一個建筑工程師學的數學肯定是不一樣的,幼兒園學的數學也是實用的,就像這里的程式也可以用來改一改就去應付。只不過這里的程式是有其適應場合、針對的人群的!
uj5u.com熱心網友回復:
這里,按照你的描述,發送資訊方是服務器,而客戶端則用來接收資訊。這里只考慮單機對單機的通訊。uj5u.com熱心網友回復:
雖然這是一個“幼兒園的”例子,但是說明了一些基本的底層概念:服務器要監聽 IPAddress.Any,服務器要等待客戶端接入(AcceptTcpClient),服務器使用與客戶端建立的連接(a)與之雙向通訊(可寫、也可讀),對于支持文本協議的通訊可以使用最基礎的 StreamWriter、StreamReader 來處理。
客戶端則必服務器端簡單一些、更少一個環節。客戶端在實體化時直接與服務器建立聯系(s),然后對于支持文本協議的通訊可以使用最基礎的 StreamWriter、StreamReader 來處理。
其實這很簡單。為什么有些代碼很復雜?你自己想想。
uj5u.com熱心網友回復:
謝謝大家的回復,我還在慢慢消化中。可能 我描述得不是很清楚,我再詳細描述一下我的需求:
●硬體:電腦1臺、普通網線1根、工業控制器1臺(比如:伺服驅動器)
●背景:當工業控制器驅動伺服電機完成一個作業周期后(只知道伺服驅動器的IP地址和發送資料的埠號,不知道其內部資料發送機制),會產生相應的結果資料:扭矩、速度、角度等。已知通過超級終端(見初貼)可以讀取到相應的結果資料,但不便于我二次處理。
●需求:想自己寫一個小程式,通過它去接收工業控制器的結果資料。拿到這個資料后,我再進行別的處理(比如讓其顯示在表單應用程式中供操作工查看,這段代碼我會寫)
這其實是一個工業場合的應用,我不知道如何寫出接收資料的代碼,還望大家指點迷津,或是給個思路或大體框架,我自己去琢磨。
誠摯感謝~~
uj5u.com熱心網友回復:
在這個應用中,電腦只接收來之工業控制器的資料。uj5u.com熱心網友回復:
以數臺電腦作為載體的聊天軟體,比如客戶端和服務端的代碼我會寫。但在這個應用中,由于工業控制器是個死物,只是單純的發送資料而已,除開可以修改ip和埠外,在通訊層面就沒有可操作的地方了。
不知道電腦和工業控制器(或者多臺控制器)之間,誰是服務端,誰是客戶端?
uj5u.com熱心網友回復:
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace 客戶端
{
public partial class Form1 : Form
{
Socket clientSocket;
Thread clientThread;
public Form1()
{
InitializeComponent();
//對跨執行緒的非法錯誤不檢查
Control.CheckForIllegalCrossThreadCalls = false;
//客戶端IP地址
this.IpAddress_textBox.Text = "127.0.0.1";
//客戶端埠號
this.Port_textBox.Text = "6001";
Thread thea = new Thread(resive);
thea.Start();
}
private void ConnectToServer()
{
byte[] data = new byte[1024];
//網路地址和服務埠的組合稱為端點,IPEndPoint 類表示這個端點
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.IpAddress_textBox.Text), int.Parse(this.Port_textBox.Text));
//初始化Socket
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//將套接字與遠程服務器地址相連
try
{
//連接到服務器
clientSocket.Connect(ipep);
}
catch (SocketException ex)
{
MessageBox.Show("connect error: " + ex.Message);
return;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
if (IpAddress_textBox.Text == "")
{
MessageBox.Show("請輸入!");
return;
}
//開啟一個子執行緒,連接到服務器
clientThread = new Thread(new ThreadStart(ConnectToServer));
clientThread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
try
{
byte[] data = new byte[1024];
//對輸入資訊進行編碼并放到一個位元組陣列了
data = Encoding.ASCII.GetBytes(txtClient.Text);
//向服務器發送資訊
clientSocket.Send(data, data.Length, SocketFlags.None);
}
catch (Exception ex)
{
MessageBox.Show("error"+ex);
}
}
private void resive()
{
try
{
int bytes = 0;
byte[] message = new byte[1024];
bytes = clientSocket.Receive(message);
MessageBox.Show("lllll");
}
catch (Exception ex)
{
MessageBox.Show("error" + ex);
}
}
private void label3_Click(object sender, EventArgs e)
{
}
}
}
uj5u.com熱心網友回復:
請問這個Form是怎么設計的
uj5u.com熱心網友回復:
Tcp通信。可以下載個此類軟體,仿照寫個。uj5u.com熱心網友回復:
首先,你查一下該平臺的官網,或者找售后要一些demo,廠家早就寫好了各種介面你直接呼叫就可以了。其次,如果你實在想寫,那你可以用visa庫,這個是工業控制里面大家普遍應用的庫。
uj5u.com熱心網友回復:
誰把此墳挖出來的轉載請註明出處,本文鏈接:https://www.uj5u.com/net/152534.html
標籤:C#
上一篇:C# 我的這個資料庫怎么跟chart控制元件系結起來 求大佬幫忙看看 !拜托了!!!急!!
下一篇:C#呼叫C++函式指標問題
