|  |  | @ -59,6 +59,14 @@ class ModbusMaster | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public $timeout_sec = 5; // Timeout 5 sec |  |  |  | 	public $timeout_sec = 5; // Timeout 5 sec | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	public $timeout_usec = 0; // is added to $timeout_sec when calculating real read timeout | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	public $socket_read_timeout_usec = 300000; // socket read timeout 300 ms | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	public $socket_write_timeout_sec = 1; // socket write timeout 1 sec | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	public $socket_write_timeout_usec = 0; // socket write timeout microseconds (must be lower than 1 sec e.g. 1000000) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public $endianness = 0; // Endianness codding (little endian == 0, big endian == 1) |  |  |  | 	public $endianness = 0; // Endianness codding (little endian == 0, big endian == 1) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public $socket_protocol = "UDP"; // Socket protocol (TCP, UDP) |  |  |  | 	public $socket_protocol = "UDP"; // Socket protocol (TCP, UDP) | 
			
		
	
	
		
		
			
				
					|  |  | @ -117,8 +125,10 @@ class ModbusMaster | 
			
		
	
		
		
			
				
					
					|  |  |  | 				$this->status .= "Bound\n"; |  |  |  | 				$this->status .= "Bound\n"; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Socket settings |  |  |  | 		// Socket settings (send/write timeout) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		socket_set_option($this->sock, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0)); |  |  |  | 		socket_set_option($this->sock, SOL_SOCKET, SO_SNDTIMEO, | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			array('sec' => $this->socket_write_timeout_sec, 'usec' => $this->socket_write_timeout_usec) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// Connect the socket |  |  |  | 		// Connect the socket | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$result = @socket_connect($this->sock, $this->host, $this->port); |  |  |  | 		$result = @socket_connect($this->sock, $this->host, $this->port); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ($result === false) { |  |  |  | 		if ($result === false) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -169,19 +179,21 @@ class ModbusMaster | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$writesocks = null; |  |  |  | 		$writesocks = null; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$exceptsocks = null; |  |  |  | 		$exceptsocks = null; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$rec = ""; |  |  |  | 		$rec = ""; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$lastAccess = time(); |  |  |  | 		$timeoutInSeconds = $this->timeout_sec + ($this->timeout_usec / 1000000); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		while (socket_select($readsocks, $writesocks, $exceptsocks, 0, 300000) !== false) { |  |  |  | 		$lastAccess = microtime(true); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			$this->status .= "Wait data ... \n"; |  |  |  | 		while (socket_select($readsocks, $writesocks, $exceptsocks, 0, $this->socket_read_timeout_usec) !== false) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			$this->status .= "Wait data ... " . PHP_EOL; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (in_array($this->sock, $readsocks)) { |  |  |  | 			if (in_array($this->sock, $readsocks)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				while (@socket_recv($this->sock, $rec, 2000, 0)) { |  |  |  | 				while (@socket_recv($this->sock, $rec, 2000, 0)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 					$this->status .= "Data received\n"; |  |  |  | 					$this->status .= "Data received" . PHP_EOL; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 					return $rec; |  |  |  | 					return $rec; | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  | 				$lastAccess = time(); |  |  |  | 				$lastAccess = microtime(true); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			} else { |  |  |  | 			} else { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if (time() - $lastAccess >= $this->timeout_sec) { |  |  |  | 				$usecSpentWaiting = microtime(true) - $lastAccess; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				if ($usecSpentWaiting >= $timeoutInSeconds) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 					throw new Exception("Watchdog time expired [ " . |  |  |  | 					throw new Exception("Watchdog time expired [ " . | 
			
		
	
		
		
			
				
					
					|  |  |  | 						$this->timeout_sec . " sec]!!! Connection to " . |  |  |  | 						$timeoutInSeconds . " sec]!!! Connection to " . | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 						$this->host . " is not established."); |  |  |  | 						$this->host . " is not established."); | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
	
		
		
			
				
					|  |  | 
 |