解决方案 »
- DatagridView 数据移植问题
- 询问下个数据库同步的办法~~~~~~~~~我标题很长~~~~~~`
- 请问,关于ListView的鼠标悬停,显示子项内容
- 关于Button的问题
- 感谢朋友发给我的在线升级程序。可惜的是我想要c#的,哪位有发给我一份。
- UP_GetRecordByPage
- 大家讨论一个翻转字符串的通用算法
- **********你们说错了,我是问:像Delphi一样,我编译的时候,能够看到整个项目有多少行,在VC#里怎么看啊,不是显示行号*******
- txt读取问题
- 我疯了,买了N本书都没解决的问题(关于FTP)
- 连载,LINQ兵法十四章,4(2of2)
- 如何实现 压缩一张图片(JPG)(不改变尺寸,只改变质量)到一个固定的字节数比如120,000 byte
2.读写送信,结果受信。
具体的还是要看你用的是那家的PLC,通信协议是什么
我这里用的是三菱的MX Component有案例吗?求救啊!
protected void Write(byte[] sendBuffer)
{
//TCPクライアントが接続されていない場合は、接続する
if (_socket == null || !_socket.Connected)
{
if (_logs != null) _logs.WriteT(GetType().Name, MethodBase.GetCurrentMethod().Name, "Connect");
Connect();
} _socket.Send(sendBuffer);
} /// <summary>
/// PLCから返信データを受信する
/// </summary>
/// <param name="recvBuffer">受信バッファ
/// 異常のときは、Length=0で返す</param>
protected void Read(out byte[] recvBuffer)
{
recvBuffer = new byte[0]; //1回目の読出:応答データ長まで
byte[] buf = new byte[RES_DATA_LENGTH_READ_COUNT];
//int readBytes = _stream.Read(buf, 0, buf.Length);
int readBytes = Read(buf, 0, buf.Length); //// readBytes != resDataLength のときは例外が発生するので、コメントアウト
////if (readBytes == buf.Length)
////{ ushort resDataLength = (ushort)BinaryConvert.ConvByteToShort(buf[IDX_OF_RES_DATA_LENGTH], buf[IDX_OF_RES_DATA_LENGTH + 1]); //2回目の読出:応答データ長で指定されたバイト数読出
if (resDataLength > 0)
{
readBytes = 0; //読出バッファのサイズを全応答データ長にする
Array.Resize(ref buf, buf.Length + resDataLength); //応答データ長の次のインデックスから受信データを格納
////readBytes = _stream.Read(buf, RES_DATA_LENGTH_READ_COUNT, resDataLength);
readBytes = Read(buf, RES_DATA_LENGTH_READ_COUNT, resDataLength);
recvBuffer = buf;
}
else
{
if (_logs != null) _logs.WriteErr(enmErrCodeFlag.Warning, GetType().Name, MethodBase.GetCurrentMethod().Name, "resDataLength:" + resDataLength.ToString());
} } /// <summary>
/// size数になるまで複数回Readする
/// </summary>
/// <param name="buffer"></param>
/// <param name="offset"></param>
/// <param name="size"></param>
/// <returns></returns>
protected int Read(byte[] buffer, int offset, int size)
{
int ret = 0;
int cnt = 0;
int readOffset = offset;
int readSize = size; while (0 < readSize)
{
try
{
int readcount = _socket.Receive(buffer, readOffset, readSize, SocketFlags.None);
if (readcount == 0) break; //相手側がShoutdown,Closeで0が返ってくることがある。
ret += readcount;
}
catch (Exception exc)
{
string msg = "Socket Timeout:" + _socket.ReceiveTimeout.ToString() + "[ms], Count:" + cnt.ToString() + ", size:" + size.ToString() + ", readSize:" + readSize.ToString();
if (_logs != null) _logs.WriteErr(enmErrCodeFlag.Warning, GetType().Name, MethodBase.GetCurrentMethod().Name, msg, exc.Message);
throw exc;
}
cnt++;
readOffset += ret;
readSize -= ret;
} if (ret != size)
{
string msg = "ret != size NG. Count:" + cnt.ToString() + ", size:" + size.ToString() + ", ret:" + ret.ToString();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < buffer.Length; i++)
{
sb.Append(buffer[i].ToString("X2")); // 16進
}
throw new InvalidOperationException(msg);
} return ret;
}