ステージを制御するためのスクリプトをZaber コンソールで作成しましたが、移動中にセンサーの読み取り値を取得したいと考えています。ステージを動かして読み、またステージを動かしたい。センサーの読み取り値が、必要な動きに影響を与えることがあります。動きをセンサーの読み取り値とどのように調整できますか?
1 つのシリアル ポートで Zaber デバイスと通信し、2 番目のシリアル ポートでセンサーと通信したいと考えています。
ステージを制御するためのスクリプトをZaber コンソールで作成しましたが、移動中にセンサーの読み取り値を取得したいと考えています。ステージを動かして読み、またステージを動かしたい。センサーの読み取り値が、必要な動きに影響を与えることがあります。動きをセンサーの読み取り値とどのように調整できますか?
1 つのシリアル ポートで Zaber デバイスと通信し、2 番目のシリアル ポートでセンサーと通信したいと考えています。
Zaber コンソール スクリプトを作成すると、Microsoft.NET フレームワークのすべてにアクセスできるため、自分で 2 つ目のシリアル ポートを開くことができます。これは、圧力センサーで一定の圧力を維持しようとする簡単な例です。ループを通過するたびに、圧力センサーを読み取り、デバイスを引っ込めて圧力を上げるか、デバイスを伸ばして圧力を下げます。
// C# example that shows how to communicate with a second serial port
#template(simple)
const string LOAD_PORT = "COM9";
const int MAX_SPEED = 20000;
const int TARGET_PRESSURE = 1000; // in thousandths of a pound
// set up load cell on serial port
using (var port = new System.IO.Ports.SerialPort())
{
port.PortName = "COM9";
port.BaudRate = 9600;
port.ReadTimeout = 500;
port.WriteTimeout = 500;
port.Open();
port.WriteLine("ct0\r");
port.ReadLine();
while ( ! IsCanceled)
{
port.WriteLine("o0w1\r");
var pressure = Int32.Parse(port.ReadLine());
int velocity = (pressure - TARGET_PRESSURE) * 20;
int speed = Math.Min(Math.Abs(velocity), MAX_SPEED);
velocity = speed * Math.Sign(velocity);
Conversation.Device.Send(Command.MoveAtConstantSpeed, velocity);
}
}
このusing
ブロックは、エラーが発生した場合でもシリアル ポートを確実に閉じます。私が使用した圧力センサーはct0
、風袋コマンドおよびo0w1
現在の圧力を返すコマンドとして理解されていました。センサーのマニュアルを参照して、センサーが理解できるコマンドを確認する必要があります。また、使用するボーレートやその他の設定を調べる必要があります。SerialPort
ドキュメントには、設定できるすべての通信パラメータがリストされています。
センサーの読み取り値からデータを記録する場合、1 つのオプションはOutput.WriteLine(data)
、出力ウィンドウにデータ値をダンプするために使用することです。次に、それらをコピーしてスプレッドシートまたはその他のファイルに貼り付けることができます。ファイルに直接書き込みたい場合は、File.CreateText()
メソッドを参照してください。