跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠

工控达摩院

  1. 主页
  2. 西门子控制系统
  3. C#与WinCC
  4. WinCE6.0与S7200SMART/S71200/S71500通讯DOME

WinCE6.0与S7200SMART/S71200/S71500通讯DOME

已定时 已固定 已锁定 已移动 C#与WinCC
1 帖子 1 发布者 4.7k 浏览 1 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Z
    Z
    zhengqiqi
    发表于 最后由 编辑
    #1


    本成程序基于VS2008编写,目前已经打通S7通讯协议,可以成功PLC读取数据,属于半成品,主要面对自已开发OEM机器与设备。

    本程序为DOME代码,集成S7通讯协议,在WinCE成功与S71200通讯,有兴趣的朋友可以一起研究。

    01.png

    class MsgSocket
    {
    private Socket TCPSocket;
    private int _ReadTimeout = 2000;
    private int _WriteTimeout = 2000;
    private int _ConnectTimeout = 1000;
    public int LastError = 0;

    public MsgSocket()
    {
    }

    ~MsgSocket()
    {
    Close();
    }

    public void Close()
    {
    if (TCPSocket != null)
    {
    //TCPSocket.Dispose();
    TCPSocket = null;
    }
    }

    private void CreateSocket()
    {
    TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //TCPSocket.NoDelay = true;
    }

    private void TCPPing(string Host, int Port)
    {
    // To Ping the PLC an Asynchronous socket is used rather then an ICMP packet.
    // This allows the use also across Internet and Firewalls (obviously the port must be opened)
    LastError = 0;
    Socket PingSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    try
    {
    //
    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(Host), Port);
    //
    IAsyncResult result = PingSocket.BeginConnect(ipe, null, null);
    //bool success = result.AsyncWaitHandle.WaitOne(_ConnectTimeout, true);
    //if (!success)
    //{
    // LastError = S7Consts.errTCPConnectionFailed;
    //}
    }
    catch
    {
    LastError = S7Consts.errTCPConnectionFailed;
    };
    PingSocket.Close();
    }

    public int Connect(string Host, int Port)
    {
    LastError = 0;
    if (!Connected)
    {
    TCPPing(Host, Port);
    if (LastError == 0)
    try
    {
    CreateSocket();
    //
    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(Host), Port);
    //

    TCPSocket.Connect(ipe);
    }
    catch
    {
    LastError = S7Consts.errTCPConnectionFailed;
    }
    }
    return LastError;
    }

    private int WaitForData(int Size, int Timeout)
    {
    bool Expired = false;
    int SizeAvail;
    int Elapsed = Environment.TickCount;
    LastError = 0;
    try
    {
    SizeAvail = TCPSocket.Available;
    while ((SizeAvail < Size) && (!Expired))
    {
    Thread.Sleep(2);
    SizeAvail = TCPSocket.Available;
    Expired = Environment.TickCount - Elapsed > Timeout;
    // If timeout we clean the buffer
    if (Expired && (SizeAvail > 0))
    try
    {
    byte[] Flush = new byte;
    TCPSocket.Receive(Flush, 0, SizeAvail, SocketFlags.None);
    }
    catch { }
    }
    }
    catch
    {
    LastError = S7Consts.errTCPDataReceive;
    }
    if (Expired)
    {
    LastError = S7Consts.errTCPDataReceive;
    }
    return LastError;
    }

    public int Receive(byte[] Buffer, int Start, int Size)
    {

    int BytesRead = 0;
    LastError = WaitForData(Size, _ReadTimeout);
    if (LastError == 0)
    {
    try
    {
    BytesRead = TCPSocket.Receive(Buffer, Start, Size, SocketFlags.None);
    }
    catch
    {
    LastError = S7Consts.errTCPDataReceive;
    }
    if (BytesRead == 0) // Connection Reset by the peer
    {
    LastError = S7Consts.errTCPDataReceive;
    Close();
    }
    }
    return LastError;
    }

    public int Send(byte[] Buffer, int Size)
    {
    LastError = 0;
    try
    {
    int BytesSent = TCPSocket.Send(Buffer, Size, SocketFlags.None);
    }
    catch
    {
    LastError = S7Consts.errTCPDataSend;
    Close();
    }
    return LastError;
    }

    public bool Connected
    {
    get
    {
    return (TCPSocket != null) && (TCPSocket.Connected);
    }
    }

    public int ReadTimeout
    {
    get
    {
    return _ReadTimeout;
    }
    set
    {
    _ReadTimeout = value;
    }
    }

    public int WriteTimeout
    {
    get
    {
    return _WriteTimeout;
    }
    set
    {
    _WriteTimeout = value;
    }

    }
    public int ConnectTimeout
    {
    get
    {
    return _ConnectTimeout;
    }
    set
    {
    _ConnectTimeout = value;
    }
    }
    }
    #endif


    附件:
    WindowsFormsApplication1.rar
    1 条回复 最后回复
    0

    你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

    厌倦了每次访问都刷到同样的帖子?您注册账号后,您下次访问时都将自动回到上次浏览的位置,并可选择接收新回复的通知(通过电子邮件或推送通知)。您还可以收藏帖子、为帖子点赞,以此向其他社区成员表达您的感谢。

    有了你的建议,这篇帖子会更精彩哦 💗

    注册 登录
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 登录或注册以进行搜索。
    Powered by NodeBB Contributors
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门
    • 世界
    • 用户
    • 群组