永发信息网

如何使用C#语言,通过TCP/UDP方式读写三菱PLC???读写是否需要先发送读写的指令???

答案:1  悬赏:70  手机版
解决时间 2021-02-06 08:29
网上看到一些相关代码,看不懂,求解释?
public static bool PlcRead(int adres, int count, ref string ReadData)
{
if (Sys.PlcComUse == 0)
return true;

PlcReadBusy = true;
string s_adres = (adres + Sys.PlcBaseAddress).ToString("0#####");
string s_count = count.ToString("0###");

string hdr = "500000FF03FF00";
string s_data = "000A04010000D*" + s_adres + s_count;
string n = (s_data.Length.ToString("X")).PadLeft(4, '0');

string dtfram = (hdr + n + s_data);
byte[] msg = Encoding.ASCII.GetBytes(dtfram);
if (Sys.Deb != 0)
{
PlcReadBusy = false;
return true;
}
int byteSend = Sock.Send(msg);
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
string smsg = encoding.GetString(msg);

System.DateTime Stime = DateTime.Now;
TimeSpan Ctime = new TimeSpan(10000000);
do
{
TimeSpan Ptime = (DateTime.Now - Stime);
if (Ptime > Ctime)
{
MessageBox.Show("PLC comm. time out error.");
PlcReadBusy = false;
return false;
}
Application.DoEvents();
} while (Sock.Available == 0);
int byteRec = Sock.Receive(RcvBytes);
代码过长后面........
最佳答案
正好我前段时间做过三菱Modbus协议电表监控开发。我只是通过自己的摸索,用C#来做监控。因为我不是专门做硬件开发的,所以可能给你的回答不是很准确,硬件监控是实时的,通过TCP、UDP什么的我还真不知道有没有这一说,我这个电表的协议是Modbus。
读写电表需要发送读写的命令,一般是  “地址 命令 个数 验证”这样的格式,接收的话,一般也是这样的。
具体的东西,其实也不难,只要你掌握了发送和接收,其他的都好说。
我给你贴主要代码。
1、发送,这里是参考了网上别人的代码,可以用,里面的一些方法,你可以找我要 master@buxiaolong.com
byte[] defByte = new byte[6];
//设备号
string str1x_03 = SendDataDevice.ToString(); // "1";
string str1_03 = "";
Boolean Macvalid1_03;
AppCode.MonitorHelper.formatstring(str1x_03, 2, out str1_03, out Macvalid1_03);
byte[] numbyte1_03 = AppCode.MonitorHelper.mysendb(str1_03);
defByte[0] = numbyte1_03[0];
//功能码 - 03
string fun_str1_03 = "03";
byte[] fun_numbyte1_03 = AppCode.MonitorHelper.mysendb(fun_str1_03);
defByte[1] = fun_numbyte1_03[0];
//起始地址
string str2x_03 = AppCode.ClientDefine.dt_sendDataList.Rows[SendDataIndex]["DataSend"].ToString(); //"0311";
AppCode.ClientDefine.SendData = AppCode.ClientDefine.dt_sendDataList.Rows[SendDataIndex]["DataSend"].ToString(); //"0311";
string str2_03 = "";
Boolean addrvalid1_03;
AppCode.MonitorHelper.formatstring(str2x_03, 4, out str2_03, out addrvalid1_03);
byte[] numbyte2_03 = AppCode.MonitorHelper.mysendb(str2_03);
defByte[2] = numbyte2_03[0];
defByte[3] = numbyte2_03[1];
// 数据数量(长度)
string str_num_03 = "1";
string str_num2_03 = Convert.ToString(Convert.ToInt16(str_num_03), 16);
string str3_03 = "";
Boolean value_valid_03;
AppCode.MonitorHelper.formatstring(str_num2_03, 4, out str3_03, out value_valid_03);
                if (value_valid_03)
                {
                    byte[] numbyte3_03 = AppCode.MonitorHelper.mysendb(str3_03);
                    defByte[4] = numbyte3_03[0];
                    defByte[5] = numbyte3_03[1];
                    //计算CRC
                    byte crch = 0;
                    byte crcl = 0;
                    AppCode.MonitorHelper.CalculateCRC(defByte, defByte.Length, out crch, out crcl);
                    // MOVE给新的数组
                    byte[] rebyte = new byte[defByte.Length + 2];
                    for (int i = 0; i < defByte.Length; i++)
                    {
                        rebyte[i] = defByte[i];
                    }
                    rebyte[6] = crcl;
                    rebyte[7] = crch;
                    mainPort.Write(rebyte, 0, rebyte.Length); // 发送 
                    Thread.Sleep(50); //暂停50 ms
                    //
                    
                }其中mainPort是一个全局(整个项目全局)的SerialPort对象
2、接收
void mainPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string errorMsg_d = "";
            try
            {
                Thread.Sleep(40);
                byte[] bs = new byte[mainPort.BytesToRead];
                mainPort.Read(bs, 0, bs.Length);
                errorMsg_d = bs.ToString();
                string str = "";
                for (int i = 0; i < bs.Length; i++)
                {
                    str += string.Format("{0:X2} ", bs[i]);
                    errorMsg_d += str + "|";
                }
                str = str.Replace(" ", "");
                //MessageBox.Show(str);
                //CheckSendData(str); //检测要发送的数据,看是属于哪一个的,就发送给谁
                //Thread.Sleep(200);
            }
            catch (Exception ex)
            {

            }

        }

其中,接收到的数据就是str,是一组16进制的数据,需要转换。
这就是主要的代码,其实差不多就够了。
希望能帮到你。这是思路。


目前我所做的功能是监控11个电表的各个数值,并有报警功能!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
QQ飞车 师傅可以和自己的徒弟结婚么?
正经给个推荐,飞利浦音乐耳机SHL4405WT怎样
【小明去商店购物,如何将身边的钱全部买练习
陈策的意思是什么啊?知道的请说下!
下列哪项内容不符合《城市道路交通规划设计规
此乃月被云遮之象,凡事昏迷未定也。大家帮解
乳腺癌要吃什么菜
学信网账户里怎么能看到是否交费
完达山贝滋特奶粉 送什么礼品 宝宝知道
烧烤生牛肉小肉串沾的料怎么做啊
很多人认为Iphone5S性价比高,清晰的屏幕,超
刨食的意思是什么啊?知道的请说下!
顺丰快递的次日费用和隔日费用一样吗
怎么去追一个有一丢丢高冷的男生
比较”是历史学习和研究的一种重要方法。17—
推荐资讯
为什么中国人吃罐头比外国少很多
御香卤熟食NO.1怎么去啊,有知道地址的么
重庆市北碚区江边汽车车身制造厂地址在哪,我
四明狂监的意思是什么啊?知道的请说下!
山里娃粉面紫砂煲拌饭在什么地方啊,我要过去
“绿叶在光下制造有机物”探究实验中,把植物
施华蔻羊绒脂系列洗发水适合卷发么,刚烫的卷,
香坊区幸福镇乐福寨安息堂地址有知道的么?有
【This card can only attack when there are
台球桌面怎么清洁?
峨眉山市公安局桂花桥派出所地址在什么地方,
患者,男,36岁,近5个月于剧烈活动时常发生
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?