PLC ST语言请进!!!!

初次接触到PLC想做个小的测试,就是在同一台PLC里面,能否Master与Slave同时存在。
如何基于TCP/IP 协议来实现Master与Slave。使用F_CreateServerHnd来初始化hServer
的时候总是失败。hSocket并没有输出值。求指教,谢谢!

2个回答

能不能不要捣乱,这不是我想要的!

你是什么品牌的PLC?没有听说过这种用法,感觉不到实际意义。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
PLC TCP通信报错10061
电脑通过网口连接三菱PLC,可以ping的通,但用以下代码就一直报10061的错误: ``` int main() { // initialize winsock WORD wVer = MAKEWORD(1, 1); // version NO:1.1, #include <WINSOCK.H> WSADATA wData; int err = WSAStartup(wVer, &wData); if (err) { printf("cannot initialize WinSock\n"); return 1; } // 建立SOCKET通信 SOCKET s = 0; s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(1); // ASA standard port server.sin_addr.s_addr = inet_addr("192.168.3.250"); // 建立CONNECT连接 int i = connect(s, (sockaddr *)&server, sizeof(sockaddr_in)); if (i < 0) // #define SOCKET_ERROR (-1) { printf("connect - error %d\n", WSAGetLastError()); closesocket(s); WSACleanup(); return 1; } return 0; } ``` 运行到connect指令就会返回10061的错误码,在cmd里ping 192.168.3.250是没问题的,但是htons( )里的端口号我不能确定,也不知道三菱PLC有没有默认的端口号,试了很多,除了给0会报10049的错误外,其它都是报10061。 麻烦那位大神帮忙看一下,头大,试了一天了
java程序读取PLC的浮点数,读取到的小数位错误,请问如何解决?
1.采用modbus4j实现了modbus通信,但读取PLC的浮点数时,读取到整数位正确,小数位错误,请问如何解决? 2. 读取PLC保持寄存器的方法如下: ``` readHoldingRegistersTest(master,1,1,4); private static void readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) { try { ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest( slaveId, start, len); ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master .send(request); if (response.isException()) { System.out.println("Exception response: message=" + response.getExceptionMessage()); } else { System.out.println(Arrays.toString(response.getShortData())); short[] list = response.getShortData(); byte[] bb = shortToBytes(list); Float ff=byte2float(bb,0); System.out.println("读到"+ff); } } catch (ModbusTransportException e) { e.printStackTrace(); } } ``` 3.和PLC通讯时,PLC给出的数字为46.68,程序读取到的数字为46.5,![图片说明](https://img-ask.csdn.net/upload/201912/10/1575987797_782854.png) 4.和modbus slave仿真软件通讯时,数据读取正常。控制台输出如下:
类的定义和它的成员函数的实现分开放会报错
为什么将类的定义和它的成员函数的实现分别放在.h和.cpp中就会报错: LNK2019: 无法解析的外部符号 "public: void __cdecl YtPlc_Mitsubishi_Mc::InitParam(void)" (?InitParam@YtPlc_Mitsubishi_Mc@@QEAAXXZ),该符号在函数 main 中被引用 PLC_test D:\zhoujy\prj\PLC_test\PLC_test\PLC_test.obj .h中的代码如下: ``` class YtPlc_Mitsubishi_Mc // : public YtPlc { public: YtPlc_Mitsubishi_Mc(); //初始化参数 void InitParam(); }; ``` .cpp中的实现如下: ``` #include "ytplc_mitsubishi_mc.h" YtPlc_Mitsubishi_Mc::YtPlc_Mitsubishi_Mc() { } void YtPlc_Mitsubishi_Mc::InitParam() { //发送命令 write_buff_[0] = 0x50; // 副头部 write_buff_[1] = 0x00; // 副头部 write_buff_[2] = 0x00; // 网络编号 write_buff_[3] = (char)0xff; // 可编程控制器编号 write_buff_[4] = (char)0xff; // 请求目标模块I/O编号L write_buff_[5] = 0x03; // 请求目标模块I/O编号H write_buff_[6] = 0x00; // 请求目标模块站号 // 长度从CPU监视定时器L到指令结束 write_buff_[7] = 0x00; //请求数据长度L write_buff_[8] = 0x00; //请求数据长度H //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73 write_buff_[9] = 0x01; // CPU监视定时器L write_buff_[10] = 0x00; // CPU监视定时器H // 指令1401 @《三菱Q_L系列通信协议参考》3.3.7 P154 write_buff_[11] = 0x01; // 指令L write_buff_[12] = 0x14; // 指令H write_buff_[13] = 0x00; // 子指令L write_buff_[14] = 0x00; // 子指令H // 字单位的批量写入 write_buff_[15] = 0x00; // 起始软元件 write_buff_[16] = 0x00; // 起始软元件 write_buff_[17] = 0x00; // 起始软元件 write_buff_[18] = 0x00; // 软元件代码 write_buff_[19] = 0x00; // 软元件点数 write_buff_[20] = 0x00; // 软元件点数 // 软元件点数的范围 // e.g 1995H 1202H 1130H -> {95H 19H 02H 12H 30H 12H} for (int i = 0; i < 20; i++) { write_buff_[21 + i * 2] = 0x00; write_buff_[21 + i * 2 + 1] = 0x00; } //读取命令 read_buff_[0] = 0x50; // 副头部 read_buff_[1] = 0x00; // 副头部 read_buff_[2] = 0x00; // 网络编号 read_buff_[3] = (char)0xff; // 可编程控制器编号 read_buff_[4] = (char)0xff; // 请求目标模块I/O编号L read_buff_[5] = 0x03; // 请求目标模块I/O编号H read_buff_[6] = 0x00; // 请求目标模块站号 read_buff_[7] = 0x0c; //请求数据长度L read_buff_[8] = 0x00; //请求数据长度H //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73 read_buff_[9] = 0x01; // CPU监视定时器L read_buff_[10] = 0x00; // CPU监视定时器H // 0401 T寄存器读取 @《三菱Q_L系列通信协议参考》3.3.6 P150 // WARNING: M寄存器读取 send_buff_[18] = 0x90 待确认 read_buff_[11] = 0x01; // 指令L read_buff_[12] = 0x04; // 指令H read_buff_[13] = 0x00; // 子指令L read_buff_[14] = 0x00; // 子指令H // 字单位的批量写入 read_buff_[15] = 0x00; // 起始软元件 read_buff_[16] = 0x00; // 起始软元件 read_buff_[17] = 0x00; // 起始软元件 read_buff_[18] = 0x00; // 软元件代码 read_buff_[19] = 0x00; // 软元件点数 read_buff_[20] = 0x00; // 软元件点数 } ``` 但如果把它们都放到头文件中,即把成员函数和构造函数的实现和类的定义放到一起,就不会有这个问题了
C#多线程访问PLC MXComponent
![图片说明](https://img-ask.csdn.net/upload/201904/29/1556549325_63419.png) 开三个线程同时读取三菱PLC内变量数据。不知道问什么报错,用单线程就没有问题。第一个线程能通过,第二个就报错。 public partial class Form1 : Form { public ACTETHERLib.ActQNUDECPUTCP plc1 = null; public ACTETHERLib.ActQNUDECPUTCP plc2 = null; public ACTETHERLib.ActQNUDECPUTCP plc3 = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.plc1 = new ACTETHERLib.ActQNUDECPUTCP(); this.plc2 = new ACTETHERLib.ActQNUDECPUTCP(); this.plc3 = new ACTETHERLib.ActQNUDECPUTCP(); this.plc1.ActHostAddress ="192.168.1.21"; this.plc1.ActHostAddress = "192.168.1.31"; this.plc1.ActHostAddress = "192.168.1.41"; int rtn1 = this.plc1.Open(); int rtn2 = this.plc2.Open(); int rtn3 = this.plc3.Open(); if (rtn1 == 0) MessageBox.Show("PLC1 Connect Succesful !"); else MessageBox.Show("PLC1 Connect Fail,Please Check Comunication Setting!"); if (rtn2 == 0) MessageBox.Show("PLC1 Connect Succesful !"); else MessageBox.Show("PLC2 Connect Fail,Please Check Comunication Setting!"); if (rtn3 == 0) MessageBox.Show("PLC1 Connect Succesful !"); else MessageBox.Show("PLC2 Connect Fail,Please Check Comunication Setting!"); Thread Read_PLC1_thread = new Thread(new ThreadStart(Read_PLC1)); Thread Read_PLC2_thread = new Thread(new ThreadStart(Read_PLC2)); Thread Read_PLC3_thread = new Thread(new ThreadStart(Read_PLC3)); Read_PLC1_thread.Start(); Read_PLC2_thread.Start(); Read_PLC3_thread.Start(); } private void Read_PLC1() { int[] PLC1_D = new int[100]; int rtn1 = this.plc1.ReadDeviceBlock("D1", 10, out PLC1_D[1]); } private void Read_PLC2() { int[] PLC2_D = new int[100]; int rtn2 = this.plc2.ReadDeviceBlock("D1", 10, out PLC2_D[1]); } private void Read_PLC3() { int[] PLC3_D = new int[100]; int rtn3 = this.plc3.ReadDeviceBlock("D1", 10, out PLC3_D[1]); } } ![图片说明](https://img-ask.csdn.net/upload/201904/07/1554638887_266844.png) }
Modbus poll工具与台达plc通讯读取寄存器D0的值,读不了,大神看看该怎么做?
![图片说明](https://img-ask.csdn.net/upload/201912/20/1576809266_568403.jpg) ![图片说明](https://img-ask.csdn.net/upload/201912/20/1576809292_881763.jpg) ![图片说明](https://img-ask.csdn.net/upload/201912/20/1576809309_100691.jpg)
PLC S7-200 SMART 已经查找到了CPU但是无法连接到指定地址?
SMART通过以太网连接PLC,可以扫描到CPU但是说 无法建立与指定地址的连接。地址可能无效或不存在!!电脑ip与CPU地址是相同网段,还有就是百度查找了些问题说关于pniomgr.exe 我也去找到这个执行文件打开是命令符黑框扫描都没有,请教下大家 PS 我扫描找到CPU地址 也把电脑改成相同网段,物理连接可以PING到,可以让PLC闪烁确定,但就是建立不了通讯。 我系统是Win8 PLC cpu st60 我下载的最新版本2.3可支持WIN10的
PC与PLC数据传输成功 ,但PLC却不能执行。
我用C++builder将数据传入到PLC的D20数据寄存器中,PLC反馈06(传输成功),但为什么PLC执行不了D20中的数据。求大神帮忙!
欧姆龙NJ系列c#写的界面程序通过sysmacgateway怎么和PLC通信
欧姆龙NJ系列c#写的界面程序通过sysmacgateway怎么和PLC通信!通过cip这些dll!要怎么使用这些方法对PLC更改变量!有相关例子和文档吗
Java实现与plc的通讯的问题
需要实现与台达plc的通讯,不知道硬件用什么与这个plc连接,软件上目前没调试,不知道modbus4j行不行,现在主要是硬件问题!
萌新求助,用plc2103做简易计算器,用数码管显示!
请问如何用plc2103做简易计算器?并且要求用数码管显示!如果有设计图就最好了!
服务器与PLC通讯,怎么读取数据
想要读取PLC中的数据,不用MODBUS,应该要怎么去读取数据?求解。。。。。。。。
利用EtherNet/IP访问PLC设备,读写数据
各位大神,谁了解EtherNet/IP访问PLC设备,读写数据的编程步骤, 目前我对该协议的了解,局限于在不同命令下,协议包的格式不同, 但是不了解如何与设备进行信息交互,看到英文文档中,有请求和应答,却不知 如何请求,如果获得应答的,求解,求解!!!!!!!!
用java写server 与西门子PLC socket通讯
有谁懂西门子PLC的。 要与西门子PLC通讯,java如何写server
C#和三菱PLC socket网络通信
以下代码是用C++和PLC通信,但是我看不懂C++,能帮我把这段代码用C#的形式写出来吗? 或者有能直接和PLC网络通信的C#源码,感谢各位高手,谢谢,非常感谢~~~ ------------------------------------------------------------------------ #include "stdafx.h" #include "SensorMounter.h" #include "SocketThread.h" IMPLEMENT_DYNCREATE(CSocketThread, CWinThread) CSocketThread::CSocketThread() : m_sIPAddress(_T("")) { m_nSocketPort = 0; m_bConnected = FALSE; m_nWtmE1 = 0; } CSocketThread::~CSocketThread() { } BOOL CSocketThread::InitInstance() return TRUE; } int CSocketThread::ExitInstance() { return CWinThread::ExitInstance(); } BEGIN_MESSAGE_MAP(CSocketThread, CWinThread) ON_THREAD_MESSAGE(WMU_SOCKET_CONNECT, OnSConnect) ON_THREAD_MESSAGE(WMU_SOCKET_SEND, OnSSend) ON_THREAD_MESSAGE(WMU_SOCKET_RECV, OnSRecv) ON_THREAD_MESSAGE(WMU_SOCKET_CLOSE, OnSClose) ON_THREAD_MESSAGE(WMU_SOCKET_QUIT, OnSQuit) END_MESSAGE_MAP() void CSocketThread::OnSConnect(UINT wParam, LONG lParam) { TRACE("CSocketThread::OnSConnect: start\n"); BOOL bRC = SocketConnect(); _ST_SEND *pSend = (_ST_SEND *)wParam; if (!pSend) return; pSend->nDoneSize = (bRC ? 0 : -1); if (pSend->hwndDone) ::SendMessage(pSend->hwndDone, WMU_SOCKET_DONE, (WPARAM)pSend, (LPARAM)pSend->nDoneSize); if (pSend->hEvDone) SetEvent(pSend->hEvDone); } void CSocketThread::OnSSend(UINT wParam, LONG lParam) { TRACE("CSocketThread::OnSSend: start\n"); _ST_SEND *pSend = (_ST_SEND *)wParam; if (!pSend) return; if (!m_bConnected) { pSend->nDoneSize = -1; if (pSend->hwndDone) ::SendMessage(pSend->hwndDone, WMU_SOCKET_DONE, (WPARAM)pSend, (LPARAM)(-1)); if (pSend->hEvDone) SetEvent(pSend->hEvDone); return; } pSend->nDoneSize = 0; switch (pSend->nDataType) { case _ST_DATA: pSend->nDoneSize = SocketSendData(pSend->nAddr, *((WORD *)pSend->pData), pSend->bDebugDisp); break; case _ST_MULTIBYTE: pSend->nDoneSize = SocketSendMultiByte(pSend->nSize, pSend->nAddr, pSend->pData, pSend->bDebugDisp); break; case _ST_MULTIWORD: pSend->nDoneSize = SocketSendMultiWord(pSend->nSize, pSend->nAddr, (WORD *)pSend->pData, pSend->bDebugDisp); break; case _ST_MULTIBYTE_BIN: pSend->nDoneSize = SocketBinSendMultiByte(pSend->nSize, pSend->nAddr, pSend->pData, pSend->bDebugDisp); break; case _ST_MULTIWORD_BIN: pSend->nDoneSize = SocketBinSendMultiWord(pSend->nSize, pSend->nAddr, (WORD *)pSend->pData, pSend->bDebugDisp); break; default: break; } if (pSend->hwndDone) ::SendMessage(pSend->hwndDone, WMU_SOCKET_DONE, (WPARAM)pSend, (LPARAM)(pSend->nDoneSize)); if (pSend->hEvDone) SetEvent(pSend->hEvDone); } void CSocketThread::OnSRecv(UINT wParam, LONG lParam) { _ST_SEND *pSend = (_ST_SEND *)wParam; if (!pSend) return; if (!m_bConnected) { pSend->nDoneSize = -1; if (pSend->hwndDone) ::SendMessage(pSend->hwndDone, WMU_SOCKET_DONE, (WPARAM)pSend, (LPARAM)(-1)); if (pSend->hEvDone) SetEvent(pSend->hEvDone); return; } BOOL bRC; switch (pSend->nDataType) { case _ST_DATA: bRC = SocketReceiveData(pSend->nAddr, (WORD *)pSend->pData, pSend->bDebugDisp); pSend->nDoneSize = (bRC ? sizeof(WORD) : 0); break; case _ST_MULTIBYTE: break; case _ST_MULTIWORD: bRC = SocketReceiveMultiWord(pSend->nSize, pSend->nAddr, (WORD *)pSend->pData, pSend->bDebugDisp); pSend->nDoneSize = (bRC ? pSend->nSize : 0); break; case _ST_MULTIWORD_BIN: bRC = SocketBinReceiveMultiWord(pSend->nSize, pSend->nAddr, (WORD *)pSend->pData, pSend->bDebugDisp); pSend->nDoneSize = (bRC ? pSend->nSize : 0); break; default: break; } if (pSend->hwndDone) ::SendMessage(pSend->hwndDone, WMU_SOCKET_DONE, (WPARAM)pSend, (LPARAM)(pSend->nDoneSize)); if (pSend->hEvDone) SetEvent(pSend->hEvDone); } void CSocketThread::OnSClose(UINT wParam, LONG lParam) { TRACE("CSocketThread::OnSClose: start\n"); SocketDisconnect(); } void CSocketThread::OnSQuit(UINT wParam, LONG lParam) { TRACE("CSocketThread::OnSQuit: start"); // AfxEndThread(0); ::PostQuitMessage(0); } BOOL CSocketThread::SocketConnect() { BOOL bRet; bRet = m_SW.Socket(m_nSocketPort); if (!bRet) { CString msg; msg.Format("[NG] port:%d code = %d:%d", m_nSocketPort, m_SW.m_nErrorCode, m_SW.m_nLastError); MessageBox(NULL, (LPCTSTR)msg, _T("CSocketThread::SocketConnect: Connect"), MB_ICONERROR); return (m_bConnected = FALSE); } bRet = m_SW.Connect((LPCTSTR)m_sIPAddress); if (!bRet) { CString msg; msg.Format("[NG] Host Connect Error \n HostName:%s code = %d:%d", (LPCTSTR)m_sIPAddress, m_SW.m_nErrorCode, m_SW.m_nLastError); MessageBox(NULL, (LPCTSTR)msg, _T("CSocketThread::SocketConnect: Connect"), MB_ICONERROR); return (m_bConnected = FALSE); } return (m_bConnected = TRUE); } BOOL CSocketThread::SocketBinSendMultiByte(int nDataNum, UINT nAddress, BYTE ucData[], BOOL bDebugDisp) { BYTE pSendBuf[37] = { 0x50, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0xCC, 0xCC, 0x10, 0x00, 0x01, 0x14, 0x01, 0x00, 0xCC, 0xCC, 0xCC, 0x90, 0xCC, 0xCC, 0xD1, 0xD1, 0xD1, 0xD1, 0xD2, 0xD2, 0xD2, 0xD2, 0xD3, 0xD3, 0xD3, 0xD3, 0xD4, 0xD4, 0xD4, 0xD4 }; WORD wDataLength = 12 + nDataNum*4; DWORD dwDeviceAddr = nAddress + (0x90<<24); WORD wDeviceNum = nDataNum*8; memcpy( &pSendBuf[7], &wDataLength, 2); memcpy( &pSendBuf[15], &dwDeviceAddr, 4); memcpy( &pSendBuf[19], &wDeviceNum, 2); BYTE pBuf[4]; for (int i=0; i<nDataNum; i++) { for (int j=0; j<4; j++) { pBuf[j] = 0x00; if( (ucData[i]&(0x01<<j*2)) ) pBuf[j] |= 0x10; if( (ucData[i]&(0x01<<(j*2+1))) ) pBuf[j] |= 0x01; } memcpy( &pSendBuf[21+i*4], &pBuf, 4); } int nSend = m_SW.SendBin( pSendBuf, 21+nDataNum*4 ); if (nSend < 0) { SocketDispErrorCode(_T("SendMultiByte(send)")); return FALSE; } if(m_nWtmE1 > 0) Sleep(m_nWtmE1); BYTE pReceiveBuf[11]; long nReceive = m_SW.ReadBin( pReceiveBuf, 11); if ( nReceive < 1 ) { SocketDispErrorCode(_T("SendMultiByte(receive)")); return FALSE; } if ( pReceiveBuf[0]==0xD0 && pReceiveBuf[1]==0x00 && pReceiveBuf[2]==0x00 && pReceiveBuf[3]==0xFF && pReceiveBuf[4]==0xFF && pReceiveBuf[5]==0x03 && pReceiveBuf[9]==0x00 && pReceiveBuf[10]==0x00 ) { if(pReceiveBuf[7]==2) return TRUE; else if(pReceiveBuf[7]==0) return FALSE; } nReceive = m_SW.ReadBin( pReceiveBuf, pReceiveBuf[7]-2); if ( nReceive < 1 ) { SocketDispErrorCode(_T("SendMultiByte(receive)")); return FALSE; } return TRUE; } BOOL CSocketThread::SocketBinSendMultiWord(int nDataNum, UINT nAddress, WORD wData[], BOOL bDebugDisp) { BYTE pSendBuf[33] = { 0x50, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0xCC, 0xCC, 0x10, 0x00, 0x01, 0x14, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xA8, 0xCC, 0xCC, 0xD1, 0xD1, 0xD2, 0xD2, 0xD3, 0xD3, 0xD4, 0xD4, 0xD5, 0xD5, 0xD6, 0xD6 }; WORD wDataLength = 12+nDataNum*2; DWORD dwDeviceAddr = nAddress + (0xA8<<24); WORD wDeviceNum = nDataNum; memcpy( &pSendBuf[7], &wDataLength, 2); memcpy( &pSendBuf[15], &dwDeviceAddr, 4); memcpy( &pSendBuf[19], &wDeviceNum, 2); memcpy( &pSendBuf[21], &wData, nDataNum); for (int i=0; i<nDataNum; i++){ pSendBuf[22+i*2] = (wData[i]&0xFF00)>>8; pSendBuf[21+i*2] = wData[i]&0x00FF; } int nSend = m_SW.SendBin( pSendBuf, 21+nDataNum*2 ); if (nSend < 0) { SocketDispErrorCode(_T("SendMultiWord(send)")); return FALSE; } if(m_nWtmE1 > 0) Sleep(m_nWtmE1); BYTE pReceiveBuf[11]; long nReceive = m_SW.ReadBin( pReceiveBuf, 11); if ( nReceive < 1 ) { SocketDispErrorCode(_T("SendMultiWord(receive)")); return FALSE; } if ( pReceiveBuf[0]==0xD0 && pReceiveBuf[1]==0x00 && pReceiveBuf[2]==0x00 && pReceiveBuf[3]==0xFF && pReceiveBuf[4]==0xFF && pReceiveBuf[5]==0x03 && pReceiveBuf[9]==0x00 && pReceiveBuf[10]==0x00 ) { if (pReceiveBuf[7]==2) return TRUE; else if (pReceiveBuf[7]==0) return FALSE; } nReceive = m_SW.ReadBin( pReceiveBuf, pReceiveBuf[7]-2); if ( nReceive < 1 ) { SocketDispErrorCode(_T("SendMultiByte(receive)")); return FALSE; } return TRUE; } BOOL CSocketThread::SocketBinReceiveMultiWord(int nDataNum, UINT nAddress, WORD wData[], BOOL bDeviceCode) { BYTE pSendBuf[21] = { 0x50, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0xCC, 0xCC, 0x10, 0x00, 0x01, 0x04, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x90, 0xCC, 0xCC }; WORD wDataLength = 12; DWORD dwDeviceAddr; if (bDeviceCode==FALSE) dwDeviceAddr = nAddress+(0x90<<24); else dwDeviceAddr = nAddress+(0xA8<<24); WORD wDeviceNum = nDataNum; memcpy( &pSendBuf[7], &wDataLength, 2); memcpy( &pSendBuf[15], &dwDeviceAddr, 4); memcpy( &pSendBuf[19], &wDeviceNum, 2); int nSend = m_SW.SendBin( pSendBuf, 21 ); if (nSend < 0) { SocketDispErrorCode(_T("SendMultiWord(send)")); return FALSE; } if(m_nWtmE1 > 0) Sleep(m_nWtmE1); BYTE pReceiveBuf[21]; int nReadLength; for (int i=0; i<21; i++) pReceiveBuf[i] = 0; long nReceive = m_SW.ReadBin( pReceiveBuf, 11); if ( nReceive < 1 ) { SocketDispErrorCode(_T("SendMultiWord(receive)")); return FALSE; } if ( pReceiveBuf[0]==0xD0 && pReceiveBuf[1]==0x00 && pReceiveBuf[2]==0x00 && pReceiveBuf[3]==0xFF && pReceiveBuf[4]==0xFF && pReceiveBuf[5]==0x03 && pReceiveBuf[9]==0x00 && pReceiveBuf[10]==0x00 ) { if(pReceiveBuf[7]==0 || pReceiveBuf[7]==2 ) return FALSE; else nReadLength = pReceiveBuf[7]-2; } else { return FALSE; } for (int i=0; i<21; i++) pReceiveBuf[i] = 0; nReceive = m_SW.ReadBin( pReceiveBuf, nReadLength); if ( nReceive < 1 ) { SocketDispErrorCode(_T("SendMultiByte(receive)")); return FALSE; } else { for(int i=0; i<nDataNum; i++) wData[i] = pReceiveBuf[2*i] + (pReceiveBuf[2*i+1]<<8); return TRUE; } } BOOL CSocketThread::SocketDisconnect(void) { return m_SW.Shutdown(); } void CSocketThread::SocketDispErrorCode(LPCTSTR strFunc) { CString strCode, strMsg; switch (m_SW.m_nErrorCode) { case 101: strCode="IDP_SOCKETS_INIT_FAILED"; break; case 1201: strCode="SW_ERR_NOERROR"; break; case 1202: strCode="SW_ERR_WSASTARTUP"; break; case 1203: strCode="SW_ERR_GETSERV"; break; case 1204: strCode="SW_ERR_GETHOSTNAME"; break; case 1205: strCode="SW_ERR_GETHOSTENT"; break; case 1206: strCode="SW_ERR_SOCK_STREAM"; break; case 1207: strCode="SW_ERR_BIND"; break; case 1208: strCode="SW_ERR_LISTEN"; break; case 1209: strCode="SW_ERR_ACCEPTTHREAD"; break; case 1210: strCode="SW_ERR_BUFFER_OVER"; break; case 1211: strCode="SW_ERR_READ"; break; case 1212: strCode="SW_ERR_SEND"; break; case 1213: strCode="SW_ERR_CONNECT"; break; case 1214: strCode="SW_ERR_ACCEPT"; break; case 1215: strCode="SW_ERR_RESUME_FAIL"; break; case 1216: strCode="SW_CONNECT_CLOSED"; break; } strMsg.Format(" Function : %s \n ErrorCode : %s \n LastError : %d", strFunc, strCode, m_SW.m_nLastError); MessageBox(NULL, (LPCTSTR)strMsg, _T("CSocketThread::SocketDispErrorCode"), MB_ICONERROR); }
C# PLC和电脑上软件以太网通讯问题
# 如题 ## 所用工具: 1,第三方拍摄软件EasyInspector 简称EI。 2,自己写的软件Checksoft。 3,基恩士PLC CPU模块KV-NC32T ## 描述下软件功能 1.EI 可以通过SOCKET的方法进行通讯,即控制什么时候开始拍照检测,并将检测的数据 返回。 2,利用上述的SOCKET方法(EI 带的例程),写了一个软件:一方面和PLC通讯,另一方面和EI软件通讯。 3,跟PLC通讯方面,checksoft作为伺服器,PLC作为客服端,我们便让checksoft 不断读取PLC某一软原件(备注:软元件相当于一个变量16BIT 或者32bit,这里是16bit的某一位,如MR402),当该位变成true,则置位标志位,通过该标志位让EI开始拍照,并且将结果回传给PLC。 ## 软件结构 ![图片说明](https://img-ask.csdn.net/upload/201807/18/1531905295_843980.png) ##存在问题 现如今存在的问题是,checksoft在不断访问的过程中会出现UI界面卡死,出现未响应的情况。而且卡死在不同的地方,线程里有一个时钟一样的东西,有时候也会停止。 ## 所做的解决措施 1,利用文字记录在死循环中不断记录,看下是在哪个地方卡死,结果就是在卡死在了线程里面,也没有在EI软件通讯上。 2,利用另一个线程监视该线程,但是我能力不够,不太成功,我上传的程序代码中,ControlUpdateAction中就是监视线程,可能我不太会用多线程。 3,UI界面卡死,因此把所有的在软件显示数值的函数都注释了,客户用过还是会出现卡死的情况。 4,EMI的问题考虑过,在网线上加了滤波磁环也不行 ## 如若有不明白的地方,欢迎向我提问,QQ329917892 ## 我会上传checksoft的源代码,和EI软件的安装包。望各位大侠慷慨解囊,各出奇招,帮帮小弟。
求个关于 PLC 人机画面 大神多的群 学习 请教!
RT! 出来打工的设备方面搞了几年了,现在想更进一步!求各位给个机会耳濡目染下! 感激不尽!
unity3D和三菱PLC通信问题
我现在有个三菱FX1s的plc,unity需要和plc进行读写操作,请问要怎么做呀? 有做过的大佬给个思路吗,万分感谢!
C#通过pc access SAMRT与S7-200 SMART通讯,上位如何实时读PLC的变量,包括I/O信号
1,C#通过pc access 与S7-200 SMART通讯没有问题。已经连接成功。 2,在上位界面上做了几个按钮和textbox,触发按钮时,textbox可以读到变量的状态。实际变量通过PLC编程调试软件也能监控到变量变化。 3,我在上位上做一列指示灯。 想实现:PLC的变量发生改变时,这一列指示灯能够根据变量状态改变颜色。 实时刷新(200ms)。 例如: I0.0变为1时,指示灯0改变颜色,由红变绿。 . . . . . I0.7变为1时,指示灯改变颜色,由红变绿。 Q0.0变为1时,指示灯0改变颜色,由红变绿。 . . . . . Q0.7变为1时,指示灯改变颜色,由红变绿。 ![图片说明](https://img-ask.csdn.net/upload/201908/07/1565144872_203127.png)
基于VB的三菱PLC跟PC通信的(读取PLC的X寄存器状态)的例子
PLC是FX3u-48M的,小弟想做一个通讯的试验,我给PLC 的X0高电平后,想从VB上的程序读出X寄存器为高电平或低电平,Y寄存器的通断可以,但是要读X寄存器的状态该怎样设置?
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
Android 9.0系统新特性,对刘海屏设备进行适配
其实Android 9.0系统已经是去年推出的“老”系统了,这个系统中新增了一个比较重要的特性,就是对刘海屏设备进行了支持。一直以来我也都有打算针对这个新特性好好地写一篇文章,但是为什么直到拖到了Android 10.0系统都发布了才开始写这篇文章呢?当然,一是因为我这段时间确实比较忙,今年几乎绝大部分的业余时间都放到写新书上了。但是最主要的原因并不是这个,而是因为刘海屏设备的适配存在一定的特殊性
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问