C#S1200modbustcp通讯

命名空间

using HslCommunication.Profinet.Siemens;
using HslCommunication;
 //声明西门子PLC S1200通信
        private SiemensS7Net Siemens1200TcpNet = null;
        private readonly SiemensPLCS SiemensPLCSelected = SiemensPLCS.S1200;
//初始化西门子通讯设置
 Siemens1200TcpNet = new SiemensS7Net(SiemensPLCSelected)
                {
                    IpAddress = "127.0.0.1",
                    ConnectTimeOut = 3000,
                    Port = 102,
                    Rack = 0,
                    Slot = 0
                };
OperateResult connect = Siemens1200TcpNet.ConnectServer();
写数据
Siemens1200TcpNet.Write("M200", (Int16)125);             // 写双字有符号
                Siemens1200TcpNet.Write("M100.0", true);
//读取数据
 short int_M100 = Siemens1200TcpNet.ReadInt16("M200").Content;

            OperateResult<short[]> read = Siemens1200TcpNet.ReadInt16("M200", 1);
            {
                if (read.IsSuccess)
                {
                    short M200 = read.Content[0];
                     
                }
                else
                {
                    // 发生了异常
                }

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 此处以M100寄存器作为示例
bool bool_M100_0     = s7NetServer.ReadBool("M100.0").Content;
byte byte_M100       = s7NetServer.ReadByte("M100").Content;         // 读取M100的值
short short_M100     = s7NetServer.ReadInt16("M100").Content;        // 读取M100-M101组成的字
ushort ushort_M100   = s7NetServer.ReadUInt16("M100").Content;       // 读取M100-M101组成的无符号的值
int int_M100         = s7NetServer.ReadInt32("M100").Content;        // 读取M100-M103组成的有符号的数据
uint uint_M100       = s7NetServer.ReadUInt32("M100").Content;       // 读取M100-M103组成的无符号的值
float float_M100     = s7NetServer.ReadFloat("M100").Content;        // 读取M100-M103组成的单精度值
long long_M100       = s7NetServer.ReadInt64("M100").Content;        // 读取M100-M107组成的大数据值
ulong ulong_M100     = s7NetServer.ReadUInt64("M100").Content;       // 读取M100-M107组成的无符号大数据
double double_M100   = s7NetServer.ReadDouble("M100").Content;       // 读取M100-M107组成的双精度值
string string_M100   = s7NetServer.ReadString("M100", 10).Content;   // 读取M100-M109组成的ASCII字符串数据
 
// 读取数组
short[] short_M100_array      = s7NetServer.ReadInt16("M100", 10).Content;      // 读取M100-M101组成的字
ushort[] ushort_M100_array    = s7NetServer.ReadUInt16("M100", 10).Content;     // 读取M100-M101组成的无符号的值
int[] int_M100_array          = s7NetServer.ReadInt32("M100", 10).Content;      // 读取M100-M103组成的有符号的数据
uint[] uint_M100_array        = s7NetServer.ReadUInt32("M100", 10).Content;     // 读取M100-M103组成的无符号的值
float[] float_M100_array      = s7NetServer.ReadFloat("M100", 10).Content;      // 读取M100-M103组成的单精度值
long[] long_M100_array        = s7NetServer.ReadInt64("M100", 10).Content;      // 读取M100-M107组成的大数据值
ulong[] ulong_M100_array      = s7NetServer.ReadUInt64("M100", 10).Content;     // 读取M100-M107组成的无符号大数据
double[] double_M100_array    = s7NetServer.ReadDouble("M100", 10).Content;     // 读取M100-M107组成的双精度值
基本的写入操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 此处以M100寄存器作为示例
s7NetServer.Write("M100", true);                       // 写入M100  bool值
s7NetServer.Write("M100", (byte)123);                  // 写入M100  byte值
s7NetServer.Write("M100", (short)1234);                // 写入M100  short值
s7NetServer.Write("M100", (ushort)45678);              // 写入M100  ushort值
s7NetServer.Write("M100", 1234566);                    // 写入M100  int值
s7NetServer.Write("M100", (uint)1234566);              // 写入M100  uint值
s7NetServer.Write("M100", 123.456f);                   // 写入M100  float值
s7NetServer.Write("M100", 123.456d);                   // 写入M100  double值
s7NetServer.Write("M100", 123456661235123534L);        // 写入M100  long值
s7NetServer.Write("M100", 523456661235123534UL);       // 写入M100  ulong值
s7NetServer.Write("M100", "K123456789");               // 写入M100  string值
 
// 读取数组
s7NetServer.Write("M100", new short[] { 123, 3566, -123 });                                      // 写入M100  short值  ,W3C0,R3C0 效果是一样的
s7NetServer.Write("M100", new ushort[] { 12242, 42321, 12323 });                                 // 写入M100  ushort值
s7NetServer.Write("M100", new int[] { 1234312312, 12312312, -1237213 });                         // 写入M100  int值
s7NetServer.Write("M100", new uint[] { 523123212, 213, 13123 });                                 // 写入M100  uint值
s7NetServer.Write("M100", new float[] { 123.456f, 35.3f, -675.2f });                             // 写入M100  float值
s7NetServer.Write("M100", new double[] { 12343.542312d, 213123.123d, -231232.53432d });          // 写入M100  double值
s7NetServer.Write("M100", new long[] { 1231231242312, 34312312323214, -1283862312631823 });      // 写入M100  long值
s7NetServer.Write("M100", new ulong[] { 1231231242312, 34312312323214, 9731283862312631823 });   // 写入M100  ulong值
5. 高级读写,所谓的高级的读写,就是读写基础的字节数据,相关的转换需要自己来完成

读数据的例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
OperateResult<byte[]> read = s7NetServer.Read("M100", 8);
if (read.IsSuccess)
{
    float temp   = s7NetServer.ByteTransform.TransInt16(read.Content, 0) / 10f;
    float press  = s7NetServer.ByteTransform.TransInt16(read.Content, 2) / 100f;
    int count    = s7NetServer.ByteTransform.TransInt32(read.Content, 2);
 
    // do something
}
else
{
    // failed
}
写数据的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 拼凑数据,这样的话,一次通讯就完成数据的全部写入
byte[] buffer = new byte[8];
s7NetServer.ByteTransform.TransByte((short)1234).CopyTo(buffer, 0);
s7NetServer.ByteTransform.TransByte((short)2100).CopyTo(buffer, 2);
s7NetServer.ByteTransform.TransByte(12353423).CopyTo(buffer, 4);
 
OperateResult write = s7NetServer.Write("M100", buffer);
if (write.IsSuccess)
{
    // success
}
else
{
    // failed
}
 
// 上面的功能等同于三个数据分别写入,下面的方式性能稍微差一点点,几乎看不出来
// s7NetServer.Write( "M100", (short)1234 );
// s7NetServer.Write( "M100", (short)2100 );
// s7NetServer.Write( "M100", 12353423 );
 

6. 服务器的高级操作,日志配置

1
2
3
4
5
6
7
8
9
10
11
12
13
public void S7Start2()
{
    try
    {
        s7NetServer = new SiemensS7Server();
        s7NetServer.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt");        // 配置日志信息
        s7NetServer.ServerStart(102);
    }
    catch (Exception ex)
    {
        Console.Write("Failed:" + HslCommunication.BasicFramework.SoftBasic.GetExceptionMessage(ex));
    }
}
7. 限制客户端的ip地址,下面举例是仅仅允许本机登录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void S7Start3()
{
    try
    {
        s7NetServer = new SiemensS7Server();
        s7NetServer.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt");        // 配置日志信息
        s7NetServer.SetTrustedIpAddress(new List<string>() { "127.0.0.1" });              // 仅仅限制本机客户端读写
        s7NetServer.ServerStart(102);
    }
    catch (Exception ex)
    {
        Console.Write("Failed:" + HslCommunication.BasicFramework.SoftBasic.GetExceptionMessage(ex));
    }
}
8. 捕捉数据接收事件,每当客户端进行数据交互的时候,都可以触发事件,然后可以对报文进行分析,比如说,分析出了客户端写入了地址M100的数据,就触发下自定义的操作,在这种情况下就可以使用如下的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void S7Start4()
{
    try
    {
        s7NetServer = new SiemensS7Server();
        s7NetServer.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt");        // 配置日志信息
        s7NetServer.SetTrustedIpAddress(new List<string>() { "127.0.0.1" });              // 仅仅限制本机客户端读写
        s7NetServer.OnDataReceived += S7NetServer_OnDataReceived;
        s7NetServer.ServerStart(102);
    }
    catch (Exception ex)
    {
        Console.Write("Failed:" + HslCommunication.BasicFramework.SoftBasic.GetExceptionMessage(ex));
    }
}
 
private void S7NetServer_OnDataReceived(object sender, byte[] data)
{
    Console.WriteLine(HslCommunication.BasicFramework.SoftBasic.ByteToHexString(data, ' ')); // 打印客户端发送的数据
}

网页说明

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值