zoukankan      html  css  js  c++  java
  • S7-200 运动控制

    电机

    42电机(42BYGH34-401A),最高速度居然是300 每分钟,卖家说的, 测试A+,A-时,将2根线短接,转动电机时会有明显的滞涩感,B+,B-一样,

    编码器

    HN3806-AB-600N ,有AB两相接24V电源,A,B两相直接连PLC I0.6,I0.7 ,这里使用PLC的向导,启用HC1

    步进控制器

    TB6600 带光耦的,控制信号3.3-24 可以直接连PLC 不用接电阻很方便,拨码开关把电流设置成0.5,细分设置成1600,也就是1600个脉冲转一圈,至于一圈移动多少毫米这个要看螺杆机构的参数(一般供应商提供)

    这里是8mm

    MAP 0 使用HC0, 并使用Q0.0 作为脉冲输出Q0.2方向,I0.0参考点输入

     

    按键位反转

    由于无法实现按位反转,所以这里使用了字节

    添加自复位功能

     完成程序

    //是PLC相对地址除以2
    //比方VD240, 从&VB100开始, 那么相对字节是140,除以2后是70,
    //因为一个保持寄存器对应2个字节
    _Monitor.SendCmd(new ReadHoldRegisterCmd(1, 70, 4));

    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 System.Threading;
    using EMDLX.Server.PLC_Core;
    using PLC.Util;
    
    namespace EMDLX.UI
    {
        public partial class frmModbusMonitor : Form
        {
            private SynchronizationContext SyncCtx = null;
            private Boolean IsRunning = false;
            private TCPModbusMonitor _Monitor = new TCPModbusMonitor("192.168.1.243", 502);
            public frmModbusMonitor()
            {
                InitializeComponent();
                SyncCtx = SynchronizationContext.Current
    ;
                btnServerSwitch.Text = "启动服务";
                _Monitor.ReceivedData += new EventHandler<ReceivedEventArgs>(_Monitor_ReceivedData);
                #region 刷新读数
                var timer = new System.Windows.Forms.Timer();
                timer.Interval = 500 * 1;
                timer.Tick += (s, e) =>
                {
                    try
                    {
                        timer.Stop();
                        //是PLC相对地址除以2
                        //比方VD240, 从&VB100开始, 那么相对字节是140,除以2后是70,
                        //因为一个保持寄存器对应2个字节
                        _Monitor.SendCmd(new ReadHoldRegisterCmd(1, 70, 12));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        timer.Start();
                    }
    
                };
                timer.Start();
                #endregion
            }
            protected override void OnClosed(EventArgs e)
            {
                try
                {
                    _Monitor.Stop();
                }
                catch { }
                base.OnClosed(e);
            }
            void _Monitor_ReceivedData(object sender, ReceivedEventArgs e)
            {
                if (e.Cmd is ReadHoldRegisterCmdResult)
                {
                    var cmd = e.Cmd as ReadHoldRegisterCmdResult;
                    var hc1 = cmd.GetInt32(0);
                    var pos = cmd.GetFloat(6);
                    var frequency = cmd.GetFloat(2);
                    var fLimit = cmd.GetRegister(8).HighByte;
                    var rLimit = cmd.GetRegister(9).LowByte;
                    var homeLimit = cmd.GetRegister(9).HighByte;
                    var motorDirection = cmd.GetRegister(10).LowByte;
                    var motorEN = cmd.GetRegister(10).HighByte;
                    var showMsg = string.Format("HC1:{0},位置:{1},频率:{2}",hc1,pos,frequency);
                    showMsg += Environment.NewLine + Environment.NewLine;
                    showMsg += string.Format("前限位:{0},后限位{1},参考点:{2},电机转向:{3},是否脱机:{4}", fLimit, rLimit, homeLimit,motorDirection,motorEN);
                   
                    SyncCtx.Post(o => {
                        txtMsg.Text = showMsg;
                    }, null);
                }
            }
    
            private void btnServerSwitch_Click(object sender, EventArgs e)
            {
                try
                {
                    if (btnServerSwitch.Text == "启动服务")
                    {
                        _Monitor.Start();
    
                        btnServerSwitch.Text = "停止服务";
                        txtTips.Text = "服务启动:" + DateTime.Now;
    
                        IsRunning = true;
    
                    }
                    else
                    {
                        _Monitor.Stop();
                        btnServerSwitch.Text = "启动服务";
    
                        txtTips.Text = "服务关闭";
                        IsRunning = false;
    
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    try
                    {
                        btnServerSwitch.Text = "启动服务";
                        _Monitor.Stop();
                        IsRunning = false;
                    }
                    catch { }
                }
            }
    
            private void frmModbusMonitor_Load(object sender, EventArgs e)
            {
    
            }
    
            private void btnHome_Click(object sender, EventArgs e)
            {
                _Monitor.SendCmd(new WriteSingleHoldRegisterCmd(1, 25, 0x01, 0x00));
            }
    
            private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
                if (checkBox1.Checked)
                {
                    //电脱机
                    _Monitor.SendCmd(new WriteSingleHoldRegisterCmd(1, 22, 0x01, 0x00));
                }
                else
                {
                    //电脱机
                    _Monitor.SendCmd(new WriteSingleHoldRegisterCmd(1, 22, 0, 0));
                }
            }
    
    
    
            private void btnMA_Click(object sender, EventArgs e)
            {
                try
                {
                    #region 设置位置
                    float pos = float.Parse(txtPos.Text);
                    var cmd = new WriteHoldRegisterCmd(1, 15,2,TCPCommandBase.FloatGetBytes(pos));
                    _Monitor.SendCmd(cmd);
                    #endregion
                    //等待100毫秒
                    Thread.Sleep(50);
                    #region 启动绝对定位
                    var cmd1 = new WriteSingleHoldRegisterCmd(1, 26, 0x01, 0x00);
                   // Console.WriteLine(cmd1.CmdHexString);
                    _Monitor.SendCmd(cmd1);
                    #endregion
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void btnMR_Click(object sender, EventArgs e)
            {
                try
                {
                    #region 设置位置
                    float pos = float.Parse(txtPos.Text);
                    var cmd = new WriteHoldRegisterCmd(1, 15, 2, TCPCommandBase.FloatGetBytes(pos));
                    _Monitor.SendCmd(cmd);
                    #endregion
                    //等待100毫秒
                    Thread.Sleep(50);
    
                    #region 设置方向
                    byte setDirectionLowByte=0x00;
                    if (ckbDirection.Checked)
                    {
                        setDirectionLowByte = 0x01;
                    }
                    _Monitor.SendCmd(new WriteSingleHoldRegisterCmd(1, 30, setDirectionLowByte, 0x00));
                    
                    #endregion
                    Thread.Sleep(50);
    
    
                    #region 启动相对定位
                    var cmd1 = new WriteSingleHoldRegisterCmd(1, 27, 0x01, 0x00);
                    _Monitor.SendCmd(cmd1);
                    #endregion
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void btnM_Click(object sender, EventArgs e)
            {
                try
                {
    
    
                    #region 设置方向
                    byte setDirectionLowByte = 0x00;
                    if (ckbDirection.Checked)
                    {
                        setDirectionLowByte = 0x01;
                    }
                    _Monitor.SendCmd(new WriteSingleHoldRegisterCmd(1, 30, setDirectionLowByte, 0x00));
    
                    #endregion
                    Thread.Sleep(50);
    
    
                    #region 启动相对定位
                    var cmd1 = new WriteSingleHoldRegisterCmd(1, 29, 0x01, 0x00);
                    _Monitor.SendCmd(cmd1);
                    #endregion
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void btnStop_Click(object sender, EventArgs e)
            {
                _Monitor.SendCmd(new WriteSingleHoldRegisterCmd(1, 28, 0x01, 0x00));
            }
    
            private void btnClearCounter_Click(object sender, EventArgs e)
            {
                _Monitor.SendCmd(new WriteSingleHoldRegisterCmd(1, 69, 0x01, 0x00));
            }
        }
    }
    View Code

     完整代码在后台文件管理PLC运动控制与艾莫讯

  • 相关阅读:
    VS2010 枚举注释任务
    osg例子中文翻译,半机翻
    怎么愉快地添加目标位置?
    变更路线节点。妈妈,我的强迫症有救啦!
    测试必备工具之抓包神器 Charles 如何抓取 https 数据包?
    测试必备工具之最强抓包神器 Charles,你会了么?
    ‘员工拒绝加班被判赔偿公司 1.8 万元’,作为测试猿你怕了么?
    全网最全测试点总结:N95 口罩应该如何测试?
    测试角度:如何看待三星大量手机系统崩溃并数据丢失事件?
    男生 vs 女生,谁更加适合做软件测试?
  • 原文地址:https://www.cnblogs.com/wdfrog/p/15047856.html
Copyright © 2011-2022 走看看