西门子PLC模块广州市代理商---广东省西门子授权供应商

供应商
广东湘恒智能科技有限公司
认证
西门子PLC
西门子伺服电机
西门子触摸屏
西门子电缆
西门子变频器
西门子模块
联系电话
13510737515
手机号
13185520415
联系人
董海波
所在地
惠州大亚湾澳头石化大道中480号太东天地花园2栋二单元9层01号房(仅限办公)
更新时间
2024-06-07 07:00

详细介绍

【导读】今天推荐一个连接西门子plc的.net库,包括使用方法以及代码。前言plc在工业自动化领域是常用的控制器,一般在和上位机界面通讯时,经常使用组态软件。以西门子plc为例,上位机可以使用西门子的wincc。但是当面对需求比较多样化的需求时,wincc难以胜任。而且作为量产的标准化产品,wincc授权的费用一笔不小的成本。s7.net.dll是应用在 .net平台上和西门子plc通讯的一个动态库。大家可以到github中直接去下载,或者直接搜索“s7.net.dll”也可以找到下载的链接。文章后也会给出链接。(一)s7net动态库说明目前该动态库支持的西门子plc类型有s7-200,s7-300,s7-400,s7-1200和s7-1500,基本涵盖了西门子所有的plc产品。该库可以直接读写plc中的全局db块,作为通讯的接口。下面对需要的一些函数以及数据类型做简单说明。构造函数:cpu为枚举类型,代表plc类型。ip 为plc地址,需要和plc组态的地址一致,同时,和通讯的pc ip地址应在同一局域网段。rack为导轨号,slot 为插槽号,均可在博途硬件组态处获得。如下图所示,ip=“192.168.0.5”。如下图所示,rack为0,slot为1。publicplc(cputype cpu, string ip, short rack, short slot);public enumcputype{        s7200 = 0,       s7300 = 10,        s7400 = 20,       s71200 = 30,        s71500= 40 }123456789获取是否连接成功:public bool isconnected { get;}1连接plc:public void open();public taskopenasync();12该类库提供了两个用于plc连接的函数,区别在于第二个为异步连接,在请求连接的过程中,不会导致线程阻塞。我个人比较喜欢第二种方式。按位写操作:参数db代表访问的db块编号,如下图所示uisendint编号为3,uireadint编号为4。startbyteadr是在数据块内以字节为单位的起始地址,可以传入0。bitadr为需要操作的位的偏移地址(以startbyteadr为基准),value为写入的值。datatype为枚举类型,我们操作的是数据块,传入datablock。public voidwritebit(datatype datatype, int db, int startbyteadr, int bitadr,bool value);public enum datatype{     counter = 28,    timer = 29,     input = 129,    output = 130,     memory = 131,     datablock =132}12345678910按字节读:count代表读的字节数量。在进行按字节读写时,对于8位的单字节变量来说没有任何问题。但是对于多字节比如在plc中16位i的int类型,需要注意大小端问题。在西门子plc中以大端模式存储数据,但是在intel的x86架构的pc上,却是以小端模式。所以,在从plc读取一个int类型的变量,需要将读取回来的字节数组高低字节调换,后面c#程序中会有详细的实现代码。publicbyte[] readbytes(datatype datatype, int db, int startbyteadr, intcount);1按字节写:value代表将要传输的数据转换成的字节数组,如果要操作一个int变量,需要提前将高低字节调换,后面c#程序中会有详细的实现代码。publicvoid writebytes(datatype datatype, int db, int startbyteadr, byte[]value);1(二)plc设置实现外部程序可以访问操作db块,需要对plc部分做一些设置。首先对于要读取或者访问的db块,要将优化的块访问取消,默认为勾选的,选中块右击选择属性。同时还要在硬件组态中,设置防护与安全中的连接机制。将“允许来自远程对象的put/get访问”勾选。如下图:(三)c#程序在c#上位机软件中,对通讯类库的函数做一个简单的包装,以方便我们使用。首先新建一个类s7,在项目中需要引用s7.net,并在该类中包含命名空间。usings7.net;1定义一个plc类型变量plc,并定义该类的构造函数和析构函数:plc plc;publics7(s7datatype.cputype cputype,string ip,int16 rack,int16 slot){   plc = new plc((cputype)cputype,ip, rack,slot);}~s7(){   this.plc.close();}12345678910定义连接函数以及关闭函数:public voidopenasync(){       this.plc.openasync(); }publicvoid close(){   this.plc.close();}123456789定义读写函数:之所以加lock,是因为在应用中数据通讯很有可能在不同的线程去操作,比如单独开一个线程定时从plc更新数据。publicbyte[] plcreadbytes(int db, int startbyteadr=0, int count=1){     try      {         lock (this)          {             returnthis.plc.readbytes(datatype.datablock, db, startbyteadr, count);         }      }     catch      {         return new byte[2];      }      }  public void plcwritebytes(int db, byte[]value, int startbyteadr = 0){        lock(this)        {           this.plc.writebytes(datatype.datablock, db,startbyteadr, value);        }    }public void plcwritebit(int db, int bitadr, bool value,s7datatype.datatype datatype = s7datatype.datatype.datablock) {    int temp1 = bitadr / 8;     int temp2 =bitadr % 8;     lock (this)     {        this.plc.writebit((datatype)datatype, db, temp1,temp2, value);     }}1234567891011128425262728293031323334定义字节和int16类型之间的转换函数(需要进行高低字节转换):publicstatic byte[] int16tobytes(int16 data) {      byte[]temp = new byte[2];      temp[0] =(byte) (data>> 8);      temp[1] = (byte)(data);     return temp;  }public static int16bytestoint16(byte[] bytes) {      int16 temp;     temp =(int16)( bytes[0] << 8 | bytes[1]);     return temp;  }

华南西门子总代理,华中西门子总代理,华东西门子总代理,华北西门子总代理,西北西门子总代理

展开全文

我们其他产品
我们的新闻
咨询 在线询价 拨打电话