我正在尝试编写一个与I / O卡接口的程序。硬件提供的文档是在C#中,我之前从未使用过C#。所以,请原谅我,如果这个问题看起来非常基本或基本。
使用制造商的功能每个I / O引脚至少需要3个变量,并且有55个引脚。这意味着很多已定义的变量。当我编写代码时,我发现它非常难看。我在这里和那里重复使用片段,这很容易成为一个功能。但是让它们成为一种功能,我失去了访问众多变量的能力。有一些简单的方法可以做到吗?
这是我目前正在使用的缩短版本。缺少的部分看起来一样。我正在使用VS2012。提前谢谢。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
/* Tool Changer Controller Program
* In theory, this program will run the tool changer through a full cycle.
* This includes: removing the current tool,
* placing the current tool in its appropriate location on the carousel,
* moving the carousel to the correct location of the new tool,
* placing the new tool in the spindle so it is ready for use.
*/
namespace Tool_Changer
{
class Program
{
static void Main(string[] args)
{
// Create PoKeys55 device object
PoKeysDevice_DLL.PoKeysDevice device = new PoKeysDevice_DLL.PoKeysDevice();
// Define all pins and correlate to correct pin
// Pin: Pin #, Status: pass/fail returned, State: On/Off status
// Swivel
byte SwivelCCWA_Pin = 0; //Set*
bool SwivelCCWA_Status = false;
bool SwivelCCWA_State = false;
byte SwivelCWA_Pin = 2; //Set*
bool SwivelCWA_Status = false;
bool SwivelCWA_State = false;
// Telescope
byte TeleExtA_Pin = 4; //Set*
bool TeleExtA_Status = false;
bool TeleExtA_State = false;
byte TeleRetA_Pin = 6; //Set*
bool TeleRetA_Status = false;
bool TeleRetA_State = false;
// Grabber
byte GrabberOpen_Pin = 12; //Set*
bool GrabberOpen_Status = false;
bool GrabberOpen_State = false;
byte ToolPresent_Pin = 13; //Get
bool ToolPresent_Status = false;
bool ToolPresent_State = false;
// Begin Tool Change procedure.
SwivelCWA_State = false;
SwivelCCWA_State = true;
SwivelCWA_Status = device.SetOutput(SwivelCWA_Pin, SwivelCWA_State); // Turn off CW
SwivelCCWA_Status = device.SetOutput(SwivelCCWA_Pin, SwivelCCWA_State); // Turn on CCW
Thread.Sleep(1000);
GrabberOpen_State = true;
GrabberOpen_Status = device.SetOutput(GrabberOpen_Pin, GrabberOpen_State); // Open Grabber
TeleRetA_State = false;
TeleExtA_State = true;
TeleRetA_Status = device.SetOutput(TeleRetA_Pin, TeleRetA_State); // Turn off retract
TeleExtA_Status = device.SetOutput(TeleExtA_Pin, TeleExtA_State); // Turn on extend
Thread.Sleep(1000);
答案 0 :(得分:2)
如果使用结构来保存公共变量,代码将变得更漂亮和更紧凑。例如:
public struct Item
{
public Item(byte pin, bool status, bool state)
{
Pin = pin;
Status = status;
State = state;
}
public byte Pin;
public bool Status;
public bool State;
}
然后不是像这样单独设置每个变量:
byte SwivelCCWA_Pin = 0; //Set*
bool SwivelCCWA_Status = false;
bool SwivelCCWA_State = false;
你只能使用一行代码:
Item swivelCCWA = new Item(0, false, false);
答案 1 :(得分:0)
创建一个包含每个引脚的所有输出设置的字典:
Dictionary<int, bool> pinStates = new Dictionary<int, bool>
{
{0, false},
{2, true},
{12, false},
{13, false}
};
然后你可以创建一个函数,所以设置所有输出引脚并在另一个字典中检索结果:
Dictionary<int, bool> pinResults = new Dictionary<int, bool>();
foreach(KeyValuePair<int, bool> pinState in pinStates)
{
pinResults[pinState.Key] = device.SetOutput(pinState.Key, pinState.Value);
}
此时,所有输出引脚都已设置,您的第二个字典将填充结果。您可以通过这种方式检索结果:
bool resultOfPin12 = pinResults[12];