libnodave是一个用于通信和控制Siemens S7系列PLC(可编程逻辑控制器)的开源库。它提供了一个简单易用的接口,使开发人员可以通过C语言与Siemens S7 PLC进行通信。
libnodave发码收码结构不清晰,本文在其基础上,对S7协议栈进线解析,直接给不ByteBuff协议栈,源码清晰结果简单。话不多说直接上代码:
1. S7TCP.h
#pragma once
#ifndef S7TCP
#define S7TCP
#define MAXSTRSIZE 1024
#define AREA_M 0x83 //m区
#define AREA_DB 0x84 //db区
#define AREA_I 0x85 //i区
class CS7TCP
{
private:
SOCKET m_socket;
unsigned char m_SendBuffer[MAXSTRSIZE];
unsigned char m_RecvBuffer[MAXSTRSIZE];
public:
int m_readlen;
unsigned char *m_pWrite;
public:
CS7TCP(SOCKET socket){
m_socket = socket;
}
BOOL Connect200SMART();
BOOL ConnectCP243();
BOOL ConnectCP343();
BOOL Connect1200();
BOOL ReadBytes(int area, int db, int start, int len, unsigned char* buffer);
BOOL WriteBytes(int area, int db, int start, int len, unsigned char* buffer);
BOOL WriteBits(int area, int db, int start, int len, unsigned char* buffer);
short GetShort(unsigned char* str);
void PutShort(unsigned char* str, short i);
private:
void Send(unsigned char* str, int len);
int Recv(unsigned char* str);
};
#endif
2. S7TCP.cpp
#include "stdafx.h"
#include "S7TCP.h"
//b200SMART,cp243,cp343长度都是22
unsigned char b200SMART[]={
0x03,0x00,0x00,0x16,
0x11,0xE0,0x00,
0x00,0x00,0x01,0x00,
0xC1,0x02,0x00,0x00,
0xC2,0x02,0x02,0x00,