2:集成的PN口支持 Modbus TCP,但是使用方式和用到的功能块和CP有些区别。原理是一样的
基于 S7-300,400 CPU 集成 PN 接口 Modbus TCP 通讯快速入门 参考如下
https://support.industry.siemens.com/cs/document/90276758/%E5%9F%BA%E4%BA%8E-s7-300400-cpu-%E9%9B%86%E6%88%90-pn-%E6%8E%A5%E5%8F%A3-modbus-tcp-%E9%80%9A%E8%AE%AF%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8?dti=0&lc=zh-CN
基于 S7-300,400 以太网通讯模块 CP343-1&CP443-1 Modbus TCP 通讯快速入门 参考如下
https://support.industry.siemens.com/cs/document/90276761/%E5%9F%BA%E4%BA%8E-s7-300400-%E4%BB%A5%E5%A4%AA%E7%BD%91%E9%80%9A%E8%AE%AF%E6%A8%A1%E5%9D%97-cp343-1cp443-1-modbus-tcp-%E9%80%9A%E8%AE%AF%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8?dti=0&lc=zh-CN
补充:
1:见上面的连接,PN口的TCP连接是需要在PLC 中调用功能块建立连接的,不需要组态。但是双方都要编程的!
2:都用高级语言自己开发上位机了,那么,你只要看下TCPIP协议,我想你应该为Socket编程吧!按照协议标准进行发送和接受数据就行。至于要度上面数据,自己和PLC 厂家定义个就行。
既然你需要走TCP协议,为什么不直接使用MODBUS TCP 这个公开的协议了,S7-300 PN口支持这个协议。
正好我前段时间做过三菱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
//
/*
string strSend = ""
for (int i = 0 i < rebyte.Length i++)
{
strSend += string.Format("{0:X2} ", rebyte[i])
}
MessageBox.Show("发送数据:" + strSend)
strSend = null*/
}
其中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个电表的各个数值,并有报警功能!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)