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;
}
 

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.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…