Commit e5f96595 刘韬

1

1 个父辈 6f4bfe8d
......@@ -92,6 +92,7 @@
<Compile Include="theMachine\Common.cs" />
<Compile Include="theMachine\JobList.cs" />
<Compile Include="theMachine\LabelParam.cs" />
<Compile Include="theMachine\DeviceRunControl.cs" />
<Compile Include="theMachine\MainMachine _BtnProcess.cs" />
<Compile Include="theMachine\DeviceBase.cs" />
<Compile Include="theMachine\MainMachine _IOMonitor.cs" />
......@@ -114,6 +115,7 @@
<Compile Include="theMachine\sub\TrayStop.cs" />
<Compile Include="theMachine\sub\TransplantMove.cs" />
<Compile Include="theMachine\sub\SideMove.cs" />
<Compile Include="theMachine\TrayManager.cs" />
<Compile Include="userControl\AxisMoveControl.cs">
<SubType>UserControl</SubType>
</Compile>
......
......@@ -12,12 +12,14 @@ namespace DeviceLibrary
{
string High;
string Low;
string DeviceGroup;
string Name;
IO_VALUE currentIOvalue = IO_VALUE.None;
public CylinderManger(string name,string high,string low) {
public CylinderManger(string name,string devicegroup,string high,string low) {
High = high;
Low = low;
Name = name;
DeviceGroup = devicegroup;
SafetyDevice.AddDevice(this);
}
public void ToHigh(MoveInfo moveInfo) {
......@@ -59,16 +61,16 @@ namespace DeviceLibrary
return;
}
IOManager.IOMove(Low, IO_VALUE.LOW);
IOManager.IOMove(High, IO_VALUE.LOW);
IOManager.IOMove(Low, IO_VALUE.LOW, DeviceGroup);
IOManager.IOMove(High, IO_VALUE.LOW, DeviceGroup);
}
public void Resume()
{
if (currentIOvalue == IO_VALUE.None)
return;
IOManager.IOMove(Low, currentIOvalue == IO_VALUE.LOW ? IO_VALUE.HIGH : IO_VALUE.LOW);
IOManager.IOMove(High, currentIOvalue == IO_VALUE.HIGH ? IO_VALUE.HIGH : IO_VALUE.LOW);
IOManager.IOMove(Low, currentIOvalue == IO_VALUE.LOW ? IO_VALUE.HIGH : IO_VALUE.LOW, DeviceGroup);
IOManager.IOMove(High, currentIOvalue == IO_VALUE.HIGH ? IO_VALUE.HIGH : IO_VALUE.LOW, DeviceGroup);
LogUtil.info($"{Name},恢复运行");
}
......
......@@ -328,7 +328,7 @@ namespace DeviceLibrary
Dictionary<string, List<Msg>> l = new Dictionary<string, List<Msg>>();
foreach (var k in MSList.Keys)
{
l.Add(k, MsgService.MSList[k].get()[k]);
l.Add(k, MsgService.MSList[k].get());
}
return l;
}
......@@ -339,7 +339,7 @@ namespace DeviceLibrary
MSList.Add(Device, this);
}
public List<Msg> msg = new List<Msg>();
public Dictionary<string, List<Msg>> get()
public List<Msg> get()
{
if (_setlogones)
{
......@@ -347,9 +347,9 @@ namespace DeviceLibrary
foreach (var m in msg)
LogUtil.info(m.msgtxt);
}
Dictionary<string, List<Msg>> l = new Dictionary<string, List<Msg>>();
l.Add(Device, new List<Msg>(msg));
return l;
//Dictionary<string, List<Msg>> l = new Dictionary<string, List<Msg>>();
//l.Add(Device, new List<Msg>(msg));
return new List<Msg>(msg);
}
public void add(string m, MsgLevel ml, ErrInfo errInfo = ErrInfo.Empty)
{
......
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DeviceLibrary
{
public class DeviceRunControl
{
public static List<ManualResetEvent> manualResets = new List<ManualResetEvent>();
List<IDevice> DevicesList;
string DeviceListName;
public delegate void ProcessMsg(List<Msg> msg);
public event ProcessMsg ProcessMsgEvent;
ManualResetEvent resetEvent = new ManualResetEvent(false);
public DeviceRunControl(string name, List<IDevice> device) {
DevicesList = device;
DeviceListName = name;
manualResets.Add(resetEvent);
}
Thread thread;
public void Start() {
thread = new Thread(new ThreadStart(Run));
thread.Start();
resetEvent.Reset();
}
void Run() {
LogUtil.info($"{DeviceListName}设备线程启动");
while (RobotManage.mainMachine.mstart)
{
Thread.Sleep(200);
ManualResetEvent.WaitAll(new ManualResetEvent[] { RobotManage.mainMachine.ResetEvent });
if (!RobotManage.mainMachine.canRunning || !RobotManage.mainMachine.mstart)
continue;
DevicesList.ForEach(x =>
{
try
{
x.Process();
}
catch (Exception ex)
{
MsgService.MSList[x.GroupName].add(ex.ToString(), MsgLevel.warning);
MsgService.MSList[x.GroupName].setlogones();
}
finally
{
var m = MsgService.MSList[x.GroupName].get();
ProcessMsgEvent?.Invoke(m);
}
});
//ProcessMoveinfoEvent?.Invoke(MoveInfo.List);
if (!RobotManage.mainMachine.UserPause)
{
DevicesList.ForEach(x =>
{
MsgService.MSList[x.GroupName].clear();
});
}
resetEvent.Set();
}
LogUtil.info($"{DeviceListName}设备线程已退出.");
}
}
}
\ No newline at end of file
......@@ -29,7 +29,7 @@ namespace DeviceLibrary
}
LogUtil.info("按下复位按钮");
ProcessMsgEvent?.Invoke(Msg.get()[Msg.Device]);
ProcessMsgEvent?.Invoke(Msg.get());
//暂停时按下reaet按钮
if (RobotManage.isRunning && RobotManage.mainMachine.UserPause)
......@@ -50,7 +50,7 @@ namespace DeviceLibrary
Msg.add(crc.GetString("Res0165","急停中,按下启动按钮,无法启动."), MsgLevel.warning);
}
LogUtil.info("按下启动按钮");
ProcessMsgEvent?.Invoke(Msg.get()[Msg.Device]);
ProcessMsgEvent?.Invoke(Msg.get());
}
}
}
\ No newline at end of file
......@@ -14,7 +14,7 @@ namespace DeviceLibrary
public partial class MainMachine : DeviceBase, IRobot
{
new public string Name { get; set; } = "Cycle Line";
private bool _canRunning = true;
private volatile bool _canRunning = true;
public bool canRunning
{
get { return _canRunning; }
......@@ -38,6 +38,8 @@ namespace DeviceLibrary
ServerCommunication ServerCM = new ServerCommunication();
public ManualResetEvent ResetEvent = new ManualResetEvent(true);
/// <summary>
/// 是否在急停中
/// </summary>
......@@ -80,7 +82,7 @@ namespace DeviceLibrary
/// <summary>
/// 整机启动变量,设置为false后将退出线程,只在停止时调用
/// </summary>
bool mstart=true;
public volatile bool mstart=true;
public void Run() {
mstart = true;
while (mstart) {
......@@ -89,6 +91,7 @@ namespace DeviceLibrary
canRunning = DeviceCheck();
if (canRunning)
{
ResetEvent.Set();
BtnProcess();
canRunning = SafeCheck();
}
......@@ -101,6 +104,7 @@ namespace DeviceLibrary
}
else if (runStatus == RunStatus.HomeReset)
{
IOMove(IO_Type.Line_Run, IO_VALUE.HIGH);
runStatus = RunStatus.Running;
}
}
......@@ -110,7 +114,7 @@ namespace DeviceLibrary
Msg.setlogones();
}
finally {
var m = Msg.get()[Msg.Device];
var m = Msg.get();
ProcessMsgEvent?.Invoke(m);
ServerCM.ProcessMsg(m);
StoreStatus currnetstoreStatus= StoreStatus.None;
......@@ -148,6 +152,7 @@ namespace DeviceLibrary
}
public void Stop() {
mstart = false;
IOMove(IO_Type.Line_Run, IO_VALUE.LOW);
Alarm(AlarmType.None);
StopMove(true);
LedProcess(null);
......@@ -161,7 +166,8 @@ namespace DeviceLibrary
OpenAllServo();
Alarm(AlarmType.None);
runStatus = RunStatus.HomeReset;
SideMove.SideMoves.Values.ToList().ForEach(s => s.Start());
SideMove.DeviceList.Values.ToList().ForEach(s => s.Start());
}
......@@ -179,8 +185,14 @@ namespace DeviceLibrary
void DeviceSuddenStop() {
if (lastSafeCheckStatus)
{
LogUtil.info("开始急停");
ResetEvent.Reset();
LogUtil.info("复位线程锁,等待其他线程完成");
ManualResetEvent.WaitAll(DeviceRunControl.manualResets.ToArray(),500);
LogUtil.info("其他线程已完成");
AxisBean.StopMultiAxis(AxisBean.List[GroupName]);
MoveInfo.List.ForEach((m) => { m.CanWhileCount = 5; });
IOMove(IO_Type.Line_Run, IO_VALUE.LOW);
SafetyDevice.PauseAll();
}
}
......
......@@ -47,6 +47,46 @@ namespace DeviceLibrary
SideMove_16,
SideMove_17,
SideMove_18,
TrayStop_01,
TrayStop_02,
TrayStop_03,
TrayStop_04,
TrayStop_05,
TrayStop_06,
TrayStop_07,
TrayStop_WaitLoadLeave,
TrayStop_LoadLeaved,
TransplantMove_01,
TransplantMove_02,
TransplantMove_03,
TransplantMove_04,
TransplantMove_05,
TransplantMove_06,
TransplantMove_07,
TransplantMove_08,
TransplantMove_09,
TransplantMove_10,
TransplantMove_11,
TransplantMove_12,
TransplantMove_13,
TransplantMove_14,
TransplantMove_15,
TransplantMove_16,
TransplantMove_17,
TransplantMove_18,
TransplantMove_19,
TransplantMove_30,
TransplantMove_31,
TransplantMove_32,
TransplantMove_33,
TransplantMove_34,
TransplantMove_35,
TransplantMove_36,
TransplantMove_37,
TransplantMove_38,
TransplantMove_39,
}
......
......@@ -83,7 +83,13 @@ namespace DeviceLibrary
}
mainThread = new Thread(new ThreadStart(mainMachine.Start));
mainThread.Start();
Thread.Sleep(50);
var d1 = new DeviceRunControl("SideMove", SideMove.DeviceList.Values.ToList<IDevice>());
var d2 = new DeviceRunControl("TransplantMove", TransplantMove.DeviceList.Values.ToList<IDevice>());
var d3 = new DeviceRunControl("TrayStop", TrayStop.DeviceList.Values.ToList<IDevice>());
d1.Start();
d2.Start();
d3.Start();
isRunning = true;
GC.KeepAlive(mainThread);
Task.Run(()=> {
......
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public partial class TrayManager
{
public static Dictionary<string,TrayInfo> Traylist = new Dictionary<string,TrayInfo>();
/// <summary>
/// 处理更新托盘信息
/// </summary>
/// <param name="rfid"></param>
/// <param name="addr"></param>
/// <param name="trayInfo"></param>
/// <returns>是否放行</returns>
public static bool Process(string rfid, int addr, out TrayInfo trayInfo) {
if (!Traylist.ContainsKey(rfid)) {
Traylist.Add(rfid, new TrayInfo());
Traylist[rfid].RFID = rfid;
}
Traylist[rfid].LastUpdateTime = DateTime.Now;
trayInfo = Traylist[rfid];
return true;
}
}
public class TrayInfo {
string _rfid;
public string RFID { get => _rfid; set {
try
{
var ss = Enum.GetNames(typeof(TrayTypeE));
TrayType = (TrayTypeE)Enum.Parse(typeof(TrayTypeE), ss.ToList().Find(s => value.StartsWith(s)));
_rfid = value;
}
catch (Exception ex) {
LogUtil.error($"获取RFID的类型时出错:{value}");
}
}
}
public string Destination;
public int DestinationAddr;
public bool HasLoad;
public LoadTypeE LoadType;
public TrayTypeE TrayType;
public DateTime LastUpdateTime;
public ReelParam ReelParam;
}
public enum LoadTypeE {
MTP2, //流水线治具托盘
MTP1, //流水线料盘托盘
S007, //料串
M03, //Tray料格
M02, //PCB料格
M01, //PizzaBOX料格
M04, //ShoeBOX料格
}
public enum TrayTypeE
{
C01, //PCB治具
C02, //Pizza治具
C03, //Tray治具
C04, //ShoeBOX治具
}
public partial class TrayManager
{
public static Dictionary<LoadTypeE, string> LoadTypeDesc = new Dictionary<LoadTypeE, string>();
public static Dictionary<TrayTypeE, string> TrayTypeDesc = new Dictionary<TrayTypeE, string>();
static TrayManager() {
LoadTypeDesc.Add(LoadTypeE.MTP2, "流水线治具托盘");
LoadTypeDesc.Add(LoadTypeE.MTP1, "流水线料盘托盘");
LoadTypeDesc.Add(LoadTypeE.S007, "料串");
LoadTypeDesc.Add(LoadTypeE.M03, "Tray料格");
LoadTypeDesc.Add(LoadTypeE.M02, "PCB料格");
LoadTypeDesc.Add(LoadTypeE.M01, "PizzaBOX料格");
LoadTypeDesc.Add(LoadTypeE.M04, "ShoeBOX料格");
TrayTypeDesc.Add(TrayTypeE.C01, "PCB治具");
TrayTypeDesc.Add(TrayTypeE.C02, "Pizza治具");
TrayTypeDesc.Add(TrayTypeE.C03, "Tray治具");
TrayTypeDesc.Add(TrayTypeE.C04, "ShoeBOX治具");
}
}
}
......@@ -14,6 +14,8 @@ PRO,50,IO信号超时时间(秒),IOSingle_TimerOut,5,,,,,,,,,,,,
PRO,0,气压检测超时,AirCheckSeconds,5,,,,,,,,,,,,
PRO,10,AMH移栽设备每毫米脉冲,AMH_TS_PoToMM,1000,,,,,,,,,,,,
PRO,10,AMH移栽设备待机点P1,AMH_TS_P1,1000,,,10000,,,,,,,,,
PRO,10,AMH移栽设备取料P2-8mm,AMH_TS_P2,1000,,,10000,,,,,,,,,
,,,,,,,,,,,,,,,,
PRO,14,机器人压紧轴每毫米脉冲,AMH_RoboComp_PoToMM,1000,,,,,,,,,,,,
PRO,14,机器人压紧轴待机点P1,AMH_RoboComp_P1,1000,,,10000,,,,,,,,,
PRO,15,托盘旋转轴每度脉冲,AMH_Route_PoToMM,1000,,,10000,,,,,,,,,
......
......@@ -132,7 +132,7 @@ namespace OnlineStore.LoadCSVLibrary
this.DIList[devicename].Add(con.ProName, io);
}
if (devicename == "root" && !ioTypeList.Contains(con.ProName))
if (!ioTypeList.Contains(con.ProName))
{
AddBuffer(con, builder);
}
......
......@@ -264,6 +264,18 @@ namespace OnlineStore.LoadCSVLibrary
/// DI,0,MI1-15寸物料检测,MI_w15_Check,57,AMH-MI1,X57,,,,,,,,,,
/// </summary>
public static string MI_w15_Check = "MI_w15_Check";
/// <summary>
/// DI,0,AMH-SBSH2托盘前阻挡检测,AMH_Front_Check,14,AMH-SBSH2,X14,,,,,,,,,,
/// </summary>
public static string AMH_Front_Check = "AMH_Front_Check";
/// <summary>
/// DI,0,AMH-SBSH2托盘到位检测,AMH_In_Check,15,AMH-SBSH2,X15,,,,,,,,,,
/// </summary>
public static string AMH_In_Check = "AMH_In_Check";
/// <summary>
/// DI,0,AMH-SBSH2托盘物料检测,AMH_Reel_Check,16,AMH-SBSH2,X16,,,,,,,,,,
/// </summary>
public static string AMH_Reel_Check = "AMH_Reel_Check";
}
public enum IO_VALUE
{
......
......@@ -94,13 +94,21 @@ namespace OnlineStore.LoadCSVLibrary
/// </summary>
[ConfigProAttribute("AMH_TS_P1")]
public int AMH_TS_P1 { get; set; }
/// <summary>
/// PRO,0,AMH移栽设备取料P2-8mm,AMH_TS_P2,1000,,,10000,,,,,,,,,
/// </summary>
[ConfigProAttribute("AMH_TS_P2")]
public int AMH_TS_P2 { get; set; }
/// <summary>
/// PRO,0,AMH移栽设备待机点P1,AMH_TS_P1,1000,,,10000,,,,,,,,,
/// </summary>
[ConfigProAttribute("AMH_TS_P1_speed")]
public int AMH_TS_P1_speed { get; set; }
/// <summary>
/// PRO,0,AMH移栽设备待机点P1,AMH_TS_P1,1000,,,10000,,,,,,,,,
/// </summary>
[ConfigProAttribute("AMH_TS_P2_speed")]
public int AMH_TS_P2_speed { get; set; }
/// <summary>
/// PRO,0,机器人压紧轴每毫米脉冲,AMH_RoboComp_PoToMM,1000,,,,,,,,,,,,
/// </summary>
......
......@@ -365,13 +365,13 @@ namespace TheMachine
if (RobotManage.mainMachine.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
{
RobotManage.mainMachine.Msg.add("急停中,无法启动", MsgLevel.warning);
MainMachine_ProcessMsgEvent(RobotManage.mainMachine.Msg.get().Values.First());
MainMachine_ProcessMsgEvent(RobotManage.mainMachine.Msg.get());
return;
}
if (RobotManage.mainMachine.IOValue(IO_Type.AutoRun_Single).Equals(IO_VALUE.LOW))
{
RobotManage.mainMachine.Msg.add("运行开关没有打开,无法启动", MsgLevel.warning);
MainMachine_ProcessMsgEvent(RobotManage.mainMachine.Msg.get().Values.First());
MainMachine_ProcessMsgEvent(RobotManage.mainMachine.Msg.get());
return;
}
RobotManage.Start();
......
......@@ -138,6 +138,12 @@
<Compile Include="SettingControl.Designer.cs">
<DependentUpon>SettingControl.cs</DependentUpon>
</Compile>
<Compile Include="TrayManagerControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="TrayManagerControl.Designer.cs">
<DependentUpon>TrayManagerControl.cs</DependentUpon>
</Compile>
<Compile Include="UC\CylinderButton.cs">
<SubType>Component</SubType>
</Compile>
......@@ -206,6 +212,9 @@
<EmbeddedResource Include="SettingControl.resx">
<DependentUpon>SettingControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="TrayManagerControl.resx">
<DependentUpon>TrayManagerControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\StorePosControl.resx">
<DependentUpon>StorePosControl.cs</DependentUpon>
</EmbeddedResource>
......

namespace TheMachine
{
partial class TrayManagerControl
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// TrayManagerControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Name = "TrayManagerControl";
this.Size = new System.Drawing.Size(725, 462);
this.ResumeLayout(false);
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TheMachine
{
public partial class TrayManagerControl : UserControl
{
public TrayManagerControl()
{
InitializeComponent();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
......@@ -45,22 +45,26 @@ namespace TheMachine
btn_linerev.Visible = false;
btn_linestop.Visible = false;
}
if (!RobotManage.Config.DOList[deviceGroup].ContainsKey(IO_Type.Ls_A_LineRwd))
{
btn_linerev.Visible = false;
}
crc.LanguageProcess(this);
}
string deviceGroup;
private void btn_linerun_Click(object sender, EventArgs e)
{
SideMove.SideMoves[deviceGroup].Line.LineRun("n", false, 999);
SideMove.DeviceList[deviceGroup].Line.LineRun("n", false, 999);
}
private void btn_linerev_Click(object sender, EventArgs e)
{
SideMove.SideMoves[deviceGroup].Line.LineRun("n", true, 999);
SideMove.DeviceList[deviceGroup].Line.LineRun("n", true, 999);
}
private void btn_linestop_Click(object sender, EventArgs e)
{
SideMove.SideMoves[deviceGroup].Line.LineStop("n");
SideMove.DeviceList[deviceGroup].Line.LineStop("n");
}
}
}
......@@ -128,7 +128,7 @@ namespace TheMachine
this.cylinderButton2.BackColor = System.Drawing.Color.White;
this.cylinderButton2.DeviceType = "root";
this.cylinderButton2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.cylinderButton2.IO_HIGH = "AMH_Sucker";
this.cylinderButton2.IO_HIGH = "AMH_Tray_Stop";
this.cylinderButton2.IO_LOW = "";
this.cylinderButton2.Location = new System.Drawing.Point(618, 404);
this.cylinderButton2.Name = "cylinderButton2";
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!