Snap7 ile Siemens PLC baglanma

hasanzincir

Paylaşımcı üye
Katılım
17 Haz 2007
Mesajlar
684
Puanları
131
Yaş
46
Selam Arkadaşlar
Genel olarak Visual diller(C#,Delphi,VB.NET) ile PLC den veri alma yada veri yazmayı Libnodave,OPC gibi kompanent yada daha özel yazılımlarla sağlıyorduk..

Bunlara yeni bir DLL kütüphanesi daha eklendi.. SNAP7.. Önce linki vereyim..

http://snap7.sourceforge.net/

DLL proje exe sinin bulunduğu yerde olması önemli..

Kendi çalışan örneklerim aşağıdadır..

Önce DELPHİ ********************************
Kod:
unit plc;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Snap7, StdCtrls ;

  function RealRead(B1,B2,B3,B4:byte):Single ;
  Procedure SymplyGet;

  var
   MyDB32 : packed array[0..1134] of byte; // generic buffer
   MyClient : TS7Client;

implementation

uses main;

function RealRead(B1,B2,B3,B4:byte):Single ;
  Var
  FTransportArray: Array[0..3] of Byte;
  FKopieSingle:    Single;
  begin
  FTransportArray[3]:= B1;
  FTransportArray[2]:= B2;
  FTransportArray[1]:= B3;
  FTransportArray[0]:= B4;
  // Byte array decoding to single
  Result := PSingle(@FTransportArray)^;
  end;

Procedure SymplyGet;
Begin
  MyClient:=TS7Client.Create;
  MyClient.ConnectTo('192.168.0.1',0,1);
  MyClient.DBRead(1488,       // DB Number
                   0,       // Start from
                   4,       // How many
                  @MyDB32); // Target address
  MyClient.Free;
End;

end.


Sonra C# ********************

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Snap7;

namespace snap7_example
{
    public partial class frmMain : Form
    {
      
        S7Client MyClient;
       

        public frmMain()
        {
            InitializeComponent();
        }

        // 1 byte lık alandan 1 biti bulan function
        // Yapı GetBit( Byte Değişken , index)
        //Not İndex : 0...7 arası rakam olmalıdır..8 olamaz../snap7 ye gore
        public bool GetBit(byte byt, int index)
        {
            if (index < 0 || index > 7)
            throw new ArgumentOutOfRangeException();
            byte bitMask = (byte)(1 << index);
            byte masked = (byte)(byt & bitMask);
            return masked != 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {

            MyClient = new S7Client();
            MyClient.ConnectTo("192.168.0.1", 0, 1);
            if (MyClient.Connected())
            {
                //Verileri cekme
                byte[] MyDB32 = new byte[6];
                MyClient.DBRead(1, 0, 6, MyDB32);
                MyClient.Disconnect();
                MyClient = null;

                //Real sayı okuma
                byte[] b = new byte[4];
                b[0] = MyDB32[5]; b[1] = MyDB32[4]; b[2] = MyDB32[3]; b[3] = MyDB32[2];
                float myFloat = System.BitConverter.ToSingle(b, 0);
                label1.Text = Convert.ToString(myFloat);

                //Bit okuma
                label2.Text = Convert.ToString(GetBit(MyDB32[0], 2));
 
Moderatör tarafında düzenlendi:
snap7 gayet güzel bence libnodaveden daha basarili olmus.
 
hasan bey paylaşım için teşekkürler.umarım arkadaşlara faydalı olur. daha önceden bana önermiş olduğunuz moka 7 kütüphanesi ile desktop uygulamasını s7-1200 ile haberleştirdim. o kütüphane nin içerisinde android içinde bir kütüphane mevcut. bu kütüphaneyi kullanıpta s7-1200 ile android'i haberleştiren var mı?örnek paylaşabilir mi?

http://sourceforge.net/projects/snap7/files/Moka7/1.0.1/moka7-full-1.0.1.zip/download

linkte burda mevcut.
 
Snap7 kullanarak 1bitlik veriyi alttaki gibi okuyabiliyoruz bir bitlik veri yazmak isterken nasil bir yol izlenmeli sizce?

private void PlcMerkerRead()
{

int Result;
byte[] Buffer = new byte[1];

Result = PLC.MBRead( 100, 1, Buffer);
TxtDump.Text = Convert.ToString(GetBit(Buffer[0], 0));
}

public bool GetBit(byte byt, int index)
{
if (index < 0 || index > 7)
throw new ArgumentOutOfRangeException();
byte bitMask = (byte)(1 << index);
byte masked = (byte)(byt & bitMask);
return masked != 0;
}
 
Snap7 kullanarak 1bitlik veriyi alttaki gibi okuyabiliyoruz bir bitlik veri yazmak isterken nasil bir yol izlenmeli sizce?

private void PlcMerkerRead()
{

int Result;
byte[] Buffer = new byte[1];

Result = PLC.MBRead( 100, 1, Buffer);
TxtDump.Text = Convert.ToString(GetBit(Buffer[0], 0));
}

public bool GetBit(byte byt, int index)
{
if (index < 0 || index > 7)
throw new ArgumentOutOfRangeException();
byte bitMask = (byte)(1 << index);
byte masked = (byte)(byt & bitMask);
return masked != 0;
}

Benim izlediğim yol
Zaten GetBit prosedüründen Byte Belli Sadece Byte index girmeniz yeterli
Atıyorum M10.4 index 4 olacaktır. Bu prosedürü istediğiniz gibi çağırabilirsiniz..

// 1 byte lık alandan 1 biti bulan function
// Yapı GetBit( Byte Değişken , index)
//Not İndex : 0...7 arası rakam olmalıdır..8 olamaz../snap7 ye gore
public bool GetBit(byte byt, int index)
{
if (index < 0 || index > 7)
throw new ArgumentOutOfRangeException();
byte bitMask = (byte)(1 << index);
byte masked = (byte)(byt & bitMask);
return masked != 0;
}
 
MBWrite kullanarak örnek verebilirmisiniz?
 
Bu Snap7 yi delphi, Vb, C de nasıl ekliyoruz component gibi mi nasıl bu dll yi çalıştıracağız anlatırsanız çok sevinirim. Şimdiden teşekkür ederim.
 

Forum istatistikleri

Konular
130,235
Mesajlar
934,638
Kullanıcılar
453,441
Son üye
mehmet_kzl34

Yeni konular

Çevrimiçi üyeler

Geri
Üst